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