laravel框架中視圖間共享數據有兩種,一種是用視圖門面share()方法實現,另一種是用視圖門面composer() 方法實現,那么,兩種方法的實現究竟是怎樣的呢?讓我們來看一看接下來的文章內容。
首先,需要注意的一點是:都是使用 View 門面來訪問 IlluminateContractsViewFactory 的底層實現
視圖門面share()方法
有時需要在所有視圖之間共享數據片段,這時候可以使用視圖門面的 share 方法。
1,一般情況下,我會在apphttpControllersxx下創建一個基礎控制器 BaseController.php,
<?php namespace AppHttpControllersExtMan; use IlluminateRoutingController; class BaseController extends Controller { public function __construct(Auth $auth) { $this->initViewShare(); //視圖共享數據 } /** * 視圖共享數據方法 */ public function initViewShare() { view()->share('action_name',get_action_name()); //當前URL的方法器名 } } //視圖使用 //共享視圖一般都是在layout中 {{ $action_name }}
get_action_name() 是自定義的一個函數。
tips:
創建 appHelpersExtmanFun.php , composer.json的autoload引入
?"files":[ ?????"app/Helpers/ExtmanFun.php" ?]
運行 composer dump-autoload 會自動加載
2,在 AppServiceProvider 服務提供器(或者新建提供器) 的boot方法中調用share()
<?php namespace AppProviders; use View; class AppServiceProvider extends ServiceProvider { /** * 啟動所有應用服務 * * @return void */ public function boot() { View::share('key', 'value'); //也可使用 view()->share('name','共享數據片段'); } }
視圖門面composer()方法
視圖合成器是當視圖被渲染時的回調函數或類方法 ,如果你每次渲染視圖時都要綁定視圖的數據,比如用戶登陸信息。可以使用composer() 將邏輯組織到一個單獨的地方。
本例中,我們將在AppServiceProvider服務提供器中注冊視圖合成器,
提供器代碼如下:
<?php namespace AppProviders; #use IlluminateSupportFacadesView; use IlluminateSupportServiceProvider; class AppServiceProvider extends ServiceProvider { public function boot() { // 使用基于類方法 // 第一個參數可以指定共享給那個視圖,多個視圖用數組,共享到全部視圖可以用 * // 或者某個目錄下所有視圖 view()->composer( //'*', 'AppHttpViewComposersAuthComposer' //['extman.home, welcome'], 'AppHttpViewComposersAuthComposer' ['extman.*'], 'AppHttpViewComposersAuthComposer' ); //使用基于回調函數 view()->composer('*',function($view){ $view->with('user',array('name'=>'test','avatar'=>'/path/to/test.jpg')); }); } other code }
如果創建一個新的服務提供器來包含視圖composer 注冊,需要添加該服務提供者到配置文件 config/app.php 的 providers 數組中
到此已經注冊了視圖合成器,每次渲染 extman目錄下所有視圖時都會執行 AuthComposer@compose 方法。
定義視圖合成器類 AppHttpViewComposersAuthComposer.php
<?php namespace AppHttpViewComposers; use IlluminateViewView; use IlluminateRepositoriesUserRepository; class AuthComposer { protected $users; public function __construct(UserRepository $users) { // 依賴注入通過服務容器自動解析... $this->users = $users; } //綁定數據到視圖 public function compose(View $view) { $user_info = Auth::user(); $view->with('motto', $user_info); $view->with('count', $this->users->count()); } }
視圖被渲染前,AuthComposer類的 compose 方法被調用,同時 IlluminateViewView 實例被注入該方法,從而可以使用其 with 方法來綁定數據到視圖。
所有的視圖合成器都會通過 服務容器 進行解析,所以你可以在視圖合成器的構造函數中類型提示需要注入的依賴項。
相關文章推薦: