75142913在线留言
【Laravel实战】通过域名返回不同视图,wap(移动版)与PC(电脑版)的非优雅解决方案_PHP技术_网络人

【Laravel实战】通过域名返回不同视图,wap(移动版)与PC(电脑版)的非优雅解决方案

Kwok 发表于:2022-05-17 11:17:53 点击:72 评论: 0

网站有2个域名,分别对应: https://www.meishiq.com 电脑访问,https://m.meishiq.com 手机/移动设备访问。可以看到这2个域名对应的界面是不一样的。在Laravel里,很多人都是重新定义路由和控制器的解决方案,我想要的除了视图不一样,控制只使用同一个。这样我们就避免了重复编码与定义路由。

一、解决方案1:修改view函数

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')。

二、解决方案2:增加一个助手函数

我目前使用这种方式,就算升级替换,也不会有什么影响。在自己定义的助手函数库文件里增加下面的内容(我的助手库 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
标签:视图模板Kwok最后编辑于:2022-05-25 11:25:55
0
感谢打赏!

《【Laravel实战】通过域名返回不同视图,wap(移动版)与PC(电脑版)的非优雅解决方案》的网友评论(0)

本站推荐阅读

热门点击文章