[ Laravel 5.8 文件 ] 基礎元件 —— 檢視
建立檢視
注:想要了解如何編寫 Blade 模板?請先檢視Blade 文件。
檢視包含應用的 HTML 程式碼,並將應用的控制器邏輯和表現邏輯進行分離。檢視檔案存放在resources/views
目錄。下面是一個簡單檢視示例:
<!-- 該檢視存放 resources/views/greeting.php --> <html> <body> <h1>Hello, {{ $name }}</h1> </body> </html>
由於這個檢視存放在resources/views/greeting.php
,我們可以通過輔助函式view
像這樣返回它:
Route::get('/', function () { return view('greeting', ['name' => '學院君']); });
正如你所看到的,傳遞給view
方法的第一個引數是resources/views
目錄下相應的檢視檔案的名字,第二個引數是一個數組,該陣列包含了在該檢視中所有有效的資料。在這個例子中,我們傳遞了一個name
變數,在檢視中通過使用Blade 語法將其顯示出來。
當然,檢視還可以存放在resources/views
的子目錄中,用“.”號來引用巢狀檢視,例如,如果檢視存放路徑是resources/views/admin/profile.blade.php
,那我們可以這樣引用它:
return view('admin.profile', $data);
判斷檢視是否存在
如果需要判斷檢視是否存在,可呼叫View
門面上的exists
方法,如果檢視在磁碟存在則返回true
:
use Illuminate\Support\Facades\View; if (View::exists('emails.customer')) { // }
建立第一個有效檢視
使用檢視上的first
方法可以建立給定檢視陣列中存在的第一個檢視。這在你的應用或擴充套件包允許自定義或覆蓋檢視時很有用:
return view()->first(['custom.admin', 'admin'], $data);
當然,也可以呼叫View
門面上的first
方法來建立:
use Illuminate\Support\Facades\View; return View::first(['custom.admin', 'admin'], $data);
傳遞資料到檢視
在上述例子中可以看到,我們可以簡單通過陣列方式將資料傳遞到檢視:
return view('greetings', ['name' => '學院君']);
以這種方式傳遞資料的話,$data
應該是一個鍵值對陣列,在檢視中,就可以使用相應的鍵來訪問資料值,比如<?php echo $key; ?>
。除此之外,還可以通過with
方法新增獨立的資料片段到檢視:
$view = view('greeting')->with('name', '學院君');
在檢視間共享資料
有時候,我們需要在所有檢視之間共享資料片段,這時候可以使用檢視門面的share
方法,通常,需要在某個服務提供者的boot
方法中呼叫share
方法,你可以將其新增到AppServiceProvider
或生成獨立的服務提供者來存放這段程式碼邏輯:
<?php namespace App\Providers; use View; class AppServiceProvider extends ServiceProvider { /** * 啟動所有應用服務 * * @return void */ public function boot() { View::share('key', 'value'); } /** * 註冊服務提供者 * * @return void */ public function register() { // } }
檢視 Composer
檢視 Composer 是當檢視被渲染時的回撥函式或類方法。如果你有一些資料要在檢視每次渲染時都做繫結,可以使用檢視 Composer 將邏輯組織到一個單獨的地方。
在本例中,首先要在某個服務提供者中註冊檢視 Composer,我們將會使用View
門面來訪問Illuminate\Contracts\View\Factory
的底層實現,記住,Laravel 不會包含預設的檢視 Composer 目錄,我們可以按照自己的喜好組織其路徑,例如可以建立一個app/Http/View/Composers
目錄:
<?php namespace App\Providers; use Illuminate\Support\Facades\View; 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\View\View; use Illuminate\Repositories\UserRepository; class ProfileComposer { /** * 使用者倉庫實現. * * @var UserRepository */ protected $users; /** * 建立一個新的屬性composer. * * @param UserRepository $users * @return void */ public function __construct(UserRepository $users) { // 依賴注入通過服務容器自動解析... $this->users = $users; } /** * 繫結資料到檢視. * * @param View $view * @return void */ public function compose(View $view) { $view->with('count', $this->users->count()); } }
檢視被渲染前,Composer 類的compose
方法被呼叫,同時Illuminate\View\View
例項被注入該方法,從而可以使用其with
方法來繫結資料到檢視。
注:所有檢視 Composer 都通過服務容器被解析,所以你可以在 Composer 類的建構函式中宣告任何你需要的依賴。
新增 Composer 到多個檢視
你可以傳遞檢視陣列作為composer
方法的第一個引數來一次性將檢視 Composer 新增到多個檢視:
View::composer( ['profile', 'dashboard'], 'App\Http\ViewComposers\MyViewComposer' );
composer
方法還支援*
萬用字元,從而允許將一個 Composer 新增到所有檢視:
View::composer('*', function ($view) { // });
檢視建立器
檢視建立器和檢視 Composer 非常類似,不同之處在於前者在檢視例項化之後立即失效而不是等到檢視即將渲染。使用View
門面的creator
方法即可註冊一個檢視建立器:
View::creator('profile', 'App\Http\ViewCreators\ProfileCreator');