我有两个刀版文件,一个用于网页,另一个用于移动设备。对于请求的处理方式,我不太确定正确的方法。
是这种方法正确吗:
在每个控制器函数的末尾(对于每个请求)?
If it is mobile (via Jenssegers)
View::make(file_mobile.blade.php)
else
View::make(file_web.blade.php)
你有什么建议呢?
我有两个刀版文件,一个用于网页,另一个用于移动设备。对于请求的处理方式,我不太确定正确的方法。
是这种方法正确吗:
在每个控制器函数的末尾(对于每个请求)?
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()
以在需要时设置它,就完成了。
BaseController
扩展了 Controller
,它是 Illuminate\Routing\Controller
的别名,任何更新都将在那里发生。 - user1669496
isMobile()
仍将在每个请求上调用。这种抽象的主要目的只是使您的控制器代码更清晰,摆脱重复的代码。 - jszobodycomposer require jenssegers/agent
时,它对我有效。如果您无法安装它,您可以前往https://github.com/jenssegers/laravel-agent/issues寻求帮助。 - jszobody