我为每个路由有两个刀片文件,一个用于 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()
以在需要时进行设置,即可完成。