視圖里面包含了你應(yīng)用程序所提供的 HTML 代碼,并且提供一個簡單的方式來分離控制器和網(wǎng)頁呈現(xiàn)上的邏輯。視圖被保存在 resources/views
文件夾內(nèi)。
一個簡單的視圖看起來可能像這樣:
<!-- 視圖被保存在 resources/views/greeting.php --><html> <body> <h1>Hello, <?php echo $name; ?></h1> </body></html>
這個視圖可以使用以下的代碼傳遞到用戶的瀏覽器:
Route::get('/', function(){ return view('greeting', ['name' => 'James']);});
如你所見,view
輔助方法的第一個參數(shù)會對應(yīng)到 resources/views
文件夾內(nèi)視圖文件的名稱;傳遞到 view
輔助方法的第二個參數(shù)是一個能夠在視圖內(nèi)取用的數(shù)據(jù)數(shù)組。
當(dāng)然,視圖文件也可以被存放在 resources/views
的子文件夾內(nèi)。舉例來說,如果你的視圖文件保存在 resources/views/admin/profile.php
,你可以用以下的代碼來返回:
return view('admin.profile', $data);
// 使用傳統(tǒng)的方法$view = view('greeting')->with('name', 'Victoria');// 使用魔術(shù)方法$view = view('greeting')->withName('Victoria');
在上面的例子代碼中,視圖將可以使用 $name
來取得數(shù)據(jù),其值為 Victoria
。
如果你想的話,還有一種方式就是直接在 view
輔助方法的第二個參數(shù)直接傳遞一個數(shù)組:
$view = view('greetings', $data);
如果你使用上面的方法來進行數(shù)據(jù)傳參, $data
必須是 鍵/值 對應(yīng)的數(shù)組數(shù)據(jù), 這樣在視圖里面, 你可以使用對應(yīng)的鍵來獲取值, 如: {{ $key }}
會取得 $data['key']
對應(yīng)的數(shù)據(jù).
有時候你可能需要共享一些數(shù)據(jù)給你的所有視圖,你有很多個選擇:view
輔助方法;Illuminate\Contracts\View\Factory
合約 (contract);在 視圖組件 (view composer) 內(nèi)使用通配符。
這里有個 view
輔助方法的例子:
view()->share('data', [1, 2, 3]);
你也可以使用 view
的 Facade:
View::share('data', [1, 2, 3]);
通常你應(yīng)該在服務(wù)提供者的 boot
方法內(nèi)使用 share
方法。你可以選擇加在 AppServiceProvider
或者是新建一個單獨的服務(wù)提供者來容納這些代碼。
備注: 當(dāng)
view
輔助方法沒有帶入任何參數(shù)調(diào)用時,它將會返回一個的Illuminate\Contracts\View\Factory
合約 (contract) 的實現(xiàn) (implementation)。
如果你需要確認(rèn)視圖是否存在,使用 exists
方法:
if (view()->exists('emails.customer')){ //}
你可以從一個完整的文件路徑來產(chǎn)生一個視圖:
return view()->file($pathToFile, $data);
視圖組件就是在視圖被渲染前,會調(diào)用的閉包或類方法。如果你想在每次渲染某些視圖時綁定數(shù)據(jù),視圖組件可以把這樣的程序邏輯組織在同一個地方。
讓我們在 服務(wù)提供者 內(nèi)組織我們的視圖組件。底下例子將使用 View
Facade 來取得底層 Illuminate\Contracts\View\Factory
合約的實現(xiàn):
<?php namespace App\Providers;use View;use Illuminate\Support\ServiceProvider;class ComposerServiceProvider extends ServiceProvider { /** * Register bindings in the container. * * @return void */ public function boot() { // 使用類來指定視圖組件 View::composer('profile', 'App\Http\ViewComposers\ProfileComposer'); // 使用閉包來指定視圖組件 View::composer('dashboard', function($view) { }); } /** * Register the service provider. * * @return void */ public function register() { // }}
備注: Laravel 沒有默認(rèn)的文件夾來放置類形式的視圖組件。你可以自由的把它們放在你想要的地方。舉例來說,你可以放在
App\Http\ViewComposers
文件夾內(nèi)。
記得要把這個服務(wù)提供者添加到 config/app.php
配置文件的 providers
數(shù)組中。
現(xiàn)在我們已經(jīng)注冊了視圖組件,并且在每次 profile
視圖渲染的時候,ProfileComposer@compose
都將會被執(zhí)行。接下來我們來看看這個類要如何定義:
<?php namespace App\Http\ViewComposers;use Illuminate\Contracts\View\View;use Illuminate\Users\Repository as UserRepository;class ProfileComposer { /** * The user repository implementation. * * @var UserRepository */ protected $users; /** * Create a new profile composer. * * @param UserRepository $users * @return void */ public function __construct(UserRepository $users) { // service container 會自動解析所需的參數(shù) $this->users = $users; } /** * Bind data to the view. * * @param View $view * @return void */ public function compose(View $view) { $view->with('count', $this->users->count()); }}
在視圖被渲染之前,視圖組件的 compose
方法就會被調(diào)用,并且傳入一個 Illuminate\Contracts\View\View
實例。你可以使用 with
方法來把數(shù)據(jù)綁定到 view
。
備注: 所有的視圖組件會被 服務(wù)容器 (service container) 解析,所以你需要在視圖組件的構(gòu)造器類型限制你所需的任何依賴參數(shù)。
View
的 composer
方法可以接受 *
作為通配符,所以你可以對所有視圖附加 composer
如下:
View::composer('*', function($view){ //});
你也可以同時針對多個視圖附加同一個視圖組件:
View::composer(['profile', 'dashboard'], 'App\Http\ViewComposers\MyViewComposer');
你可以使用 composers
方法來同時定義一群視圖組件:
View::composers([ 'App\Http\ViewComposers\AdminComposer' => ['admin.index', 'admin.profile'], 'App\Http\ViewComposers\UserComposer' => 'user', 'App\Http\ViewComposers\ProductComposer' => 'product']);
視圖 創(chuàng)建者 幾乎和視圖組件運作方式一樣;只是視圖創(chuàng)建者會在視圖初始化后就立刻執(zhí)行。要注冊一個創(chuàng)建者,只要使用 creator
方法:
View::creator('profile', 'App\Http\ViewCreators\ProfileCreator');
更多建議: