网站有2个域名,分别对应: https://www.meishiq.com 电脑访问,https://m.meishiq.com 手机/移动设备访问。可以看到这2个域名对应的界面是不一样的。在Laravel里,很多人都是重新定义路由和控制器的解决方案,我想要的除了视图不一样,控制只使用同一个。这样我们就避免了重复编码与定义路由。
view函数放到了第三方目录里,此方式一步到位的可以修改所有视图目录载入方式,但些方法有一些不妥的地方,如:升级将被覆盖。不过也是一种解决思路,打开:vendor/laravel/framework/src/Illuminate/Foundation/helpers.php 找到此函数:
function view($view = null, $data = [], $mergeData = [])
{
//判断是否使用手机目录下的模板
if (!empty($view)) {
$view = request()->getHost() == 'm.meishiq.com' ? 'wap.' . $view : 'pc.' . $view;
}
$factory = app(ViewFactory::class);
if (func_num_args() === 0) {
return $factory;
}
return $factory->make($view, $data, $mergeData);
}
现在只需要在 resources/views 目录将原来的模板全部放到pc目录下,并复制一份为wap目录。
如果模板里有依赖继承,如原来是@extends('base') ,这些就要修改成对应的目录:@extends('pc.base') 与 @extends('wap.base')。
我目前使用这种方式,就算升级替换,也不会有什么影响。在自己定义的助手函数库文件里增加下面的内容(我的助手库 app/helpers.php):
if (!function_exists('get_view_path')) {
/**
* 说明: 检测移动版域名返回不同目录的Views
* @param string: $view 模板名称
* @return string: 区分PC与WAP目录
*/
function get_view_path(string $view)
{
return (request()->getHost() == 'm.meishiq.com' ? 'wap.' : 'pc.') . $view;
}
}
然后批量替换控制器目录下的代码:
return view('article.show', $data); //将数据交给视图处理
替换为:
return view(get_view_path('article.show'), $data); //将数据交给视图处理
我们通过助手函数get_view_path来判断当前域名是否为手机版,并返回相应的模板视图路径,以达到区别。
目前来说,这算是一种比较好的处理方式吧,如果你有更好的方案可以评论告诉我。
除非注明,网络人的文章均为原创,转载请以链接形式标明本文地址:https://www.55mx.com/post/224
《【Laravel实战】通过域名返回不同视图,wap(移动版)与PC(电脑版)的非优雅解决方案》的网友评论(0)