如何在 Laravel 中渲染网页和移动视图
Posted
技术标签:
【中文标题】如何在 Laravel 中渲染网页和移动视图【英文标题】:How to render web and mobile views in Laravel 【发布时间】:2015-03-17 18:47:00 【问题描述】:每条路线都有两个刀片文件,一个用于网络,一个用于移动设备。我不知道处理请求的正确方法。 这是正确的方法吗:
在每个控制器函数的末尾(对于每个请求)
If it is mobile (via Jenssegers)
View::make(file_mobile.blade.php)
else
View::make(file_web.blade.php)
你有什么建议?
【问题讨论】:
【参考方案1】:一种选择是使用 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');
这都是未经测试的代码,只是为了向您指出一种可能的解决方案。
【讨论】:
谢谢。进行抽象是否会阻止对每个请求执行 isMobile 函数? 不,isMobile()
仍将在每个请求上调用,因为它是每个控制器操作调用的宏的一部分。这种抽象的主要目的只是让你的控制器代码更简洁,避免重复代码。
当我输入“composer require jenssegers/agent”或“”composer require jenssegers/agent:dev-master”时,会报错。”composer update composer”和”composer self-update” don'解决问题。
@user2356198 composer require jenssegers/agent
在我尝试时对我有用。如果无法安装,您可能想去github.com/jenssegers/laravel-agent/issues 询问。【参考方案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框架时插入的代码不是被删除了吗? 不应该。BaseController
扩展 Controller
是 Illuminate\Routing\Controller
的别名,这将是任何更新发生的地方。以上是关于如何在 Laravel 中渲染网页和移动视图的主要内容,如果未能解决你的问题,请参考以下文章