如何在 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 扩展 ControllerIlluminate\Routing\Controller 的别名,这将是任何更新发生的地方。

以上是关于如何在 Laravel 中渲染网页和移动视图的主要内容,如果未能解决你的问题,请参考以下文章

Laravel 布局问题

如何使用 Laravel 高效地制作网页和移动游戏

Laravel - 如何在视图中创建(匿名)动态刀片组件

如何使用 vuejs 在 laravel 刀片中显示验证错误

Laravel:使用 AJAX 请求渲染部分视图

在 Laravel 中删除渲染视图