laravel多視圖共享數據實例代碼
前言
在做項目中,網站前臺或者後臺有些數據需要在多個視圖頁面使用,例如用戶基本信息數據,菜單展示數據。首先想到的是在每個控制器裡傳入這些需要的數據,但顯然這並不科學。經查視圖文檔瞭解,可以使用視圖間共享數據和視圖Composer解決。
在視圖間共享數據
有時候我們需要在所有視圖之間共享數據片段,這時候可以使用視圖工廠的 share 方法,通常,需要在服務提供者的 boot 方法中調用 share 方法,你可以將其添加到 AppServiceProvider 或生成獨立的服務提供者來存放它們:
<?php namespace App\Providers; class AppServiceProvider extends ServiceProvider { /** * 啟動所有應用服務 * * @return void */ public function boot() { view()->share('name', 'dashuai'); } /** * 註冊服務提供者 * * @return void */ public function register() { // } }
在各視圖中使用 $name 即可調用。
視圖Composer
視圖Composer 是當視圖被渲染時的回調或類方法。如果你有一些數據要在視圖每次渲染時都做綁定,可以使用視圖 Composer 將邏輯組織到一個單獨的地方。
首先要在服務提供者中註冊視圖 Composer,我們將會使用輔助函數 view 來訪問 Illuminate\Contracts\View\Factory 的底層實現,記住,Laravel 不會包含默認的視圖 Composer 目錄,我們可以按照自己的喜好組織其路徑,例如可以創建一個 App\Http\ViewComposers 目錄:
<?php namespace App\Providers; use Illuminate\Support\ServiceProvider; class ComposerServiceProvider extends ServiceProvider { /** * 在容器中註冊綁定. * * @return void * @author http://laravelacademy.org */ public function boot() { // 使用基於類的composers... view()->composer( 'profile', 'App\Http\ViewComposers\ProfileComposer' ); // 使用基於閉包的composers... view()->composer('dashboard', function ($view) { }); } /** * 註冊服務提供者. * * @return void */ public function register() { // } }
如果創建一個新的服務提供者來包含視圖 Composer 註冊,需要添加該服務提供者到配置文件 config/app.php 的 providers 數組中。
現在我們已經註冊瞭 Composer,每次 profile 視圖被渲染時都會執行 ProfileComposer@compose,接下來我們來定義該 Composer 類:
<?php namespace App\Http\ViewComposers; use Illuminate\Contracts\View\View; use Illuminate\Users\Repository as UserRepository; class ProfileComposer { /** * 用戶倉庫實現. * * @var UserRepository */ protected $users; /** * 創建一個新的屬性composer. * * @param UserRepository $users * @return void */ public function __construct(UserRepository $users) { // Dependencies automatically resolved by service container... $this->users = $users; } /** * 綁定數據到視圖. * * @param View $view * @return void */ public function compose(View $view) { $view->with('count', $this->users->count()); } }
視圖被渲染前,Composer 類的 compose 方法被調用,同時 Illuminate\Contracts\View\View 被註入該方法,從而可以使用其 with 方法來綁定數據到視圖。
添加 Composer 到多個視圖
你可以傳遞視圖數組作為 composer 方法的第一個參數來一次性將視圖 Composer 添加到多個視圖:
view()->composer( ['profile', 'dashboard'], 'App\Http\ViewComposers\MyViewComposer' );
composer 方法接受 * 通配符,從而允許將一個 Composer 添加到所有視圖:
view()->composer('*', function ($view) { // });
總結
到此這篇關於laravel多視圖共享數據的文章就介紹到這瞭,更多相關laravel多視圖共享數據內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!
推薦閱讀:
- 詳解Laravel框架的依賴註入功能
- 淺談一種Laravel路由文件劃分方式
- Larave框架通過sanctum進行API鑒權詳解
- laravel 中repository模式使用詳解
- 詳解Laravel服務容器的優勢