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


How to render web and mobile views in Laravel

我为每个路由有两个刀片文件,一个用于 Web,一个用于移动设备。我不知道处理请求的正确方法。这是一种正确的方式:

在每个控制器功能的末尾(对于每个请求)

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('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()以在需要时进行设置,即可完成。