?
我們都知道模板一般會用到繼承,導航欄就是一個很好的例子,但是導航欄的數據如何共享,比如有個導航的文件叫在view/navigation.blade.php
為了簡單一點,文件里只有設置了一個變量
1 | {{? $cqh ?}} |
現在的要求是每個頁面都會用到這個變量,如何共享這個數據呢?
一般這樣的操作我會在Laravel服務的boot方法里設置,下面介紹兩種共享數據的方法
方法一:使用View:share方法,如CqhServiceProvider里
1 2 3 4 | public ?function ?boot() { ???? View::share( 'cqh' , 'chenqionghe' ); } |
這是使用外觀模式,也可以直接使用view()方法,
1 | view()->share( 'cqh' ,? 'chenqionghe' ); |
?
方法二:使用composer方法單獨對這個navigation.blade.php進行傳送數據,方法如下
1 2 3 4 5 6 | public ?function ?boot() { ???? view()->composer( 'navigation' ,? function ?( $view ) { ???????? $view ->with( 'cqh' , 'chenqionghe' ); ???? }); } |
以上是使用閉包的形式來完成這個操作,其實這和路由一樣,也可以用類來代替,Laravel里叫組件,方法如下
1 2 3 4 | public ?function ?boot() { ???? View::composer( 'navigation' ,? 'App\Http\ViewComposers\MyViewComposer' ); } |
上面這樣就是注冊了視圖組件,并且在每次 navigation視圖渲染的時候,MyViewComposer@compose 都將會被執行。
下面我們來看這個組件怎么定義
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 方法就會被調用,并且傳入一個 Illuminate\Contracts\View\View 實例。你可以使用 with 方法來把數據綁定到 view。
注意:方法一和方法二其實是有區別的,方法一是對所有的視圖都傳遞的cqh數據,而方法二只是對navigation視圖傳遞了cqh數據
如果方法二要達到方法一的效果,可以這樣
1 2 3 4 | View::composer( '*' ,? function ( $view ) { ???? // }); |
這樣就會對所有視圖進行傳遞了
也可以針對多個視圖指定MyViewComposer組件
1 | View::composer([ 'navigation' ,? 'footer' ],? 'App\Http\ViewComposers\MyViewComposer' ); |
?
也可以使用 composers 方法來同時定義一群視圖組件
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' ]); |