如何在 Laravel 中呈现 Web 和移动视图

How to render web and mobile views in Laravel

每条路线我有两个 blade 文件,一个用于网络,一个用于移动设备。我不知道处理请求的正确方法。 这是正确的方法吗:

在每个控制器功能结束时(对于每个请求)

If it is mobile (via Jenssegers)
    View::make(file_mobile.blade.php)
else
    View::make(file_web.blade.php)

你有什么建议?

一种选择是使用像 Laravel Agent 这样的库。

https://github.com/jenssegers/Laravel-Agent

if ( Agent::isMobile() ) {
    View::make("file_mobile.blade.php");
} else {
    View::make("file_web.blade.php");
}

与其在每个控制器方法中重复这一点,不如将其抽象出来。 response macro 似乎是个不错的选择,可能类似于:

Response::macro('ress', function($viewname)
{
    if ( Agent::isMobile() ) {
        return View::make($viewname . "_mobile.blade.php");
    } else {
        return View::make($viewname . "_web.blade.php");
    }
});

以便您可以在控制器中调用它:

return Response::ress('file');

这些都是未经测试的代码,只是为您指出一种可能的解决方案。

jszobody 的答案可能是最好的,因为您已经制作了每个版本的视图,但将来,我会考虑控制器布局。

基本上您要做的是构建两种布局,一种用于移动设备,一种用于非移动设备,然后在 BaseController 的构造函数中进行设置。这些布局将包含所有必要的样式、导航栏或所有视图应该共有的任何其他内容。

public function __construct()
{
    $this->layout = Agent::isMobile() ? 'layouts.mobile' : 'layouts.nonMobile';
}

两种布局都会有一个 @yields('content') 来为其提供内容部分,您的所有视图都应该只关心布局中显示的内容。

那么您只需在布局中设置内容部分,而不是在控制器中返回视图。

$this->layout->content = View::make('user.content');`

这是我在个人项目中所做的,通常效果很好。如果您想尝试新的网站布局或需要添加移动布局甚至管理布局,只需创建布局,修改 BaseController::__constructor() 以在需要时进行设置,即可完成。