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

7

我有两个刀版文件,一个用于网页,另一个用于移动设备。对于请求的处理方式,我不太确定正确的方法。

是这种方法正确吗:

在每个控制器函数的末尾(对于每个请求)?

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

你有什么建议呢?

2个回答

14

一个选择是使用像 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');

这是一段未经测试的代码,仅供参考可能的解决方案。


谢谢。抽象化是否防止每个请求执行isMobile函数? - horse
不,由于它是每个控制器操作调用的宏的一部分,因此isMobile()仍将在每个请求上调用。这种抽象的主要目的只是使您的控制器代码更清晰,摆脱重复的代码。 - jszobody
当我输入“composer require jenssegers/agent”或“composer require jenssegers/agent:dev-master”时,会出现错误。 “composer update composer”和“composer self-update”无法解决问题。 - horse
@user2356198 当我尝试使用composer require jenssegers/agent时,它对我有效。如果您无法安装它,您可以前往https://github.com/jenssegers/laravel-agent/issues寻求帮助。 - jszobody

2

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

基本上,您需要构建两个布局,一个用于移动设备,一个用于非移动设备,并将它们设置在BaseController的构造函数中。这些布局将包含所有必要的样式,导航栏或任何其他所有视图共有的元素。

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

两种布局都需要一个@yields('content')来提供内容区域,所有视图只需关注在布局中显示的内容。然后,您所要做的就是在控制器中设置布局中的内容部分,而不是返回视图。
$this->layout->content = View::make('user.content');`

这是我在个人项目中经常使用的方法,通常效果不错。如果您想尝试新的网站布局,或需要添加移动布局或管理布局,只需创建布局,修改BaseController::__constructor()以在需要时设置它,就完成了。


当你更新Laravel框架时,插入的代码难道不会被删除吗? - horse
不应该。BaseController 扩展了 Controller,它是 Illuminate\Routing\Controller 的别名,任何更新都将在那里发生。 - user1669496

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接