laravel 视图共享数据
需求背景,网站的头部数据,底部数据大多数都是共享的数据,每个页面都需要,基本都是保持不变的数据,这个时候,如果在每个控制器中都去查询数据传递变量,这样
就很麻烦,造成[一变全改],某一个地方漏掉了,几乎就是一个致命bug了。那么在laravel中,就刚好有一个方法来帮助偷懒的开发者解决这个问题。
- 先说一个复杂的完整的写法。
-
首先需要在
app/provides
文件下面创建一个ViewServiceProvider
服务提供者,这个服务提供者继承框架的的ViewServiceProvider
视图服务服务
提供者,然后把config/app.php
文件下providers
数组中的ViewServiceProvider
替换为我们自己的ViewServiceProvider
-
在
app
下面新建一个View
文件夹,在View
文件夹下面新建一个Composers
文件夹,这个文件下面就是存放需要共享的试图数据,比如需要共享一个导航栏的
的数据,那么就需要建立一个HeaderCompose
类,这个类中只有一个固定的方法compose()
:返回需要共享的数据
class HeaderCompose
{
public function compose(View $view)
{
$data = '共享数据 header';
return $view->with(compact('data'));
}
}
- 在我们自己的
ViewServiceProvider
服务提供者的boot()
方法中,完成数据绑定,view()->composer()
,这个方法接收两个参数,一个是需要把数据
绑定到的共享视图。比如现在需要共享到resources/views/layouts/header.blade.php
,那么这个地方的第一个参数就是layouts.header
,第二个参数
可以是一个闭包,这个闭包返回需要的数据,还可以是第二步创建的一个类,HeaderCompose::class
,到这里基本就是大功告成了。
view()->composer(['layouts.header'], HeaderCompose::class);
- 在模板文件
layouts.header
直接调用第二步绑定的参数就可以了。
- 第二种是面对简单的数据,可以直接使用一个闭包函数就可以处理的,那么就不需要创建
ViewServiceProvider
覆盖原本的ViewServiceProvider
,这个时
候只需要在AppServiceProvider
服务提供者boot()
方法中添加
public function boot()
{
view()->composer(['layouts.header'], function($view) {
$view->with('data2', '共享数据之闭包');
});
}