您好,登錄后才能下訂單哦!
這篇文章給大家介紹使用Laravel5.4框架怎么實現一個視圖共享數據功能,內容非常詳細,感興趣的小伙伴們可以參考借鑒,希望對大家能有所幫助。
在視圖中共享數據
除了在單個視圖中傳遞指定數據之外,有時候需要在所有視圖中傳入同一數據,即我們需要在不同視圖中共享數據。要實現這一目的,需要使用視圖工廠的share方法。
全局幫助函數view和response類似,如果傳入參數,則返回Illuminate\View\View實例,不傳入參數則返回Illuminate\View\Factory實例。所以我們可以通過在服務提供者的boot方法中使用如下方式實現視圖間共享數據:
<?php namespace App\Providers; use Illuminate\Support\ServiceProvider; class AppServiceProvider extends ServiceProvider { /** * Bootstrap any application services. * * @return void */ public function boot() { //視圖間共享數據 view()->share('name','高偉'); } /** * Register any application services. * * @return void */ public function register() { // } }
接下來我直接用一個空的Laravel項目做演示,我們在 routes 文件首頁(welcome.blade.php)視圖:
Route::get('/', function () { return view('welcome'); });
然后在視圖中輸出視圖共享數據:
<!DOCTYPE html> <html> <head> <title>Laravel</title> <style> html, body { height: 100%; } body { margin: 0; padding: 0; width: 100%; display: table; font-weight: 100; font-family: 'Lato'; } .container { text-align: center; display: table-cell; vertical-align: middle; } .content { text-align: center; display: inline-block; } .title { font-size: 96px; } </style> </head> <body> <div class="container"> <div class="content"> <div class="title">Laravel 5</div> <h2>hello,{{$name}}</h2> </div> </div> </body> </html>
視圖Composer
上面的一種做法雖然可行,但是在別人下載項目后,共享數據是從數據庫中獲取的,執行數據遷移的時候會報錯。這時候我們就要用到視圖Composer,視圖Composer通過視圖工廠的composer方法實現。該方法的第二個回調參數支持基于控制器動作和閉包函數兩種方式。
控制器的動作方式
首先要在服務提供者中注冊視圖 Composer,我們將會使用輔助函數 view 來訪問 Illuminate\Contracts\View\Factory 的底層實現,記住,Laravel 不會包含默認的視圖 Composer 目錄,我們可以按照自己的喜好組織其路徑,例如可以創建一個 App\Http\ViewComposers 目錄:
<?php namespace App\Http\ViewComposers; use Illuminate\Contracts\View\View; /** * 基于類的實現方式 */ class MottoComposer { /** * 共享數據 * @date 2018-01-13 * @author 高偉 * @param View $view [description] * @return [type] [description] */ public function compose(View $view) { $view->with('motto', '嘎嘎嘎,我一直在努力!'); } }
然后我們在 AppServiceProvider 中繼續添加共享數據:
<?php namespace App\Providers; use Illuminate\Support\ServiceProvider; class AppServiceProvider extends ServiceProvider { /** * Bootstrap any application services. * * @return void */ public function boot() { view()->share('name','高偉'); // 使用基于類的composers...第一個參數可以指定共享給那個視圖,多個視圖用數組,共享到全部視圖可以用 * view()->composer( 'welcome', 'App\Http\ViewComposers\MottoComposer' ); } /** * Register any application services. * * @return void */ public function register() { // } }
在視圖中顯示共享數據:
... <div class="content"> <div class="title">Laravel 5</div> <h2>hello,{{$name}}</h2> <p>{{$motto}}</p> </div> ...
閉包實現方式
閉包的實現方式相對來說簡單很多,這里就簡單貼書代碼:
<?php namespace App\Providers; use Illuminate\Support\ServiceProvider; class AppServiceProvider extends ServiceProvider { /** * Bootstrap any application services. * * @return void */ public function boot() { view()->share('name','高偉'); // 使用基于類的composers... view()->composer( 'welcome', 'App\Http\ViewComposers\MottoComposer' ); // 閉包實現方式 view()->composer('*',function($view) { $view->with('info','http://www.iwanli.me'); }); } /** * Register any application services. * * @return void */ public function register() { // } }
視圖中顯示數據:
... <div class="content"> <div class="title">Laravel 5</div> <h2>hello,{{$name}}</h2> <p>{{$motto}}</p> <p>{{$info}}</p> </div> ...
關于使用Laravel5.4框架怎么實現一個視圖共享數據功能就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。