Laravel 5 多個(gè)視圖共享數(shù)據(jù)的方法
我們都知道模板一般會(huì)用到繼承,導(dǎo)航欄就是一個(gè)很好的例子,但是導(dǎo)航欄的數(shù)據(jù)如何共享
我們都知道模板一般會(huì)用到繼承,導(dǎo)航欄就是一個(gè)很好的例子,但是導(dǎo)航欄的數(shù)據(jù)如何共享,比如有個(gè)導(dǎo)航的文件叫在view/navigation.blade.php
為了簡單一點(diǎn),文件里只有設(shè)置了一個(gè)變量
1
|
{{ $cqh }}
|
現(xiàn)在的要求是每個(gè)頁面都會(huì)用到這個(gè)變量,如何共享這個(gè)數(shù)據(jù)呢?
一般這樣的操作我會(huì)在Laravel服務(wù)的boot方法里設(shè)置,下面介紹兩種共享數(shù)據(jù)的方法
方法一:使用View:share方法,如CqhServiceProvider里
1
2
3
4
|
public function boot()
{
View::share('cqh','chenqionghe');
}
|
這是使用外觀模式,也可以直接使用view()方法,
1
|
view()->share('cqh', 'chenqionghe');
|
方法二:使用composer方法單獨(dú)對這個(gè)navigation.blade.php進(jìn)行傳送數(shù)據(jù),方法如下
1
2
3
4
5
6
|
public function boot()
{
view()->composer('navigation', function ($view) {
$view->with('cqh','chenqionghe');
});
}
|
以上是使用閉包的形式來完成這個(gè)操作,其實(shí)這和路由一樣,也可以用類來代替,Laravel里叫組件,方法如下
1
2
3
4
|
public function boot()
{
View::composer('navigation', 'App\Http\ViewComposers\MyViewComposer');
}
|
上面這樣就是注冊了視圖組件,并且在每次 navigation視圖渲染的時(shí)候,MyViewComposer@compose 都將會(huì)被執(zhí)行。
下面我們來看這個(gè)組件怎么定義
1
2
3
4
5
6
7
8
9
|
<?php namespace App\Http\ViewComposers;
use Illuminate\Contracts\View\View;
class MyViewComposer
{
public function compose(View $view)
{
$view->with('cqh','chenqionghe');
}
}
|
在視圖被渲染之前,視圖組件的 compose 方法就會(huì)被調(diào)用,并且傳入一個(gè) Illuminate\Contracts\View\View 實(shí)例。你可以使用 with 方法來把數(shù)據(jù)綁定到 view。
注意:方法一和方法二其實(shí)是有區(qū)別的,方法一是對所有的視圖都傳遞的cqh數(shù)據(jù),而方法二只是對navigation視圖傳遞了cqh數(shù)據(jù)
如果方法二要達(dá)到方法一的效果,可以這樣
1
2
3
4
|
View::composer('*', function($view)
{
//
});
|
這樣就會(huì)對所有視圖進(jìn)行傳遞了
也可以針對多個(gè)視圖指定MyViewComposer組件
1
|
View::composer(['navigation', 'footer'], 'App\Http\ViewComposers\MyViewComposer');
|
也可以使用 composers 方法來同時(shí)定義一群視圖組件
1
2
3
4
5
|
View::composers([
'App\Http\ViewComposers\AdminComposer' => ['admin.index', 'admin.profile'],
'App\Http\ViewComposers\UserComposer' => 'user',
'App\Http\ViewComposers\ProductComposer' => 'product'
]);
|
責(zé)任編輯:李英杰
來源:
博客園