視圖里面包含了你應用程序所提供的 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ù)會對應到 resources/views
文件夾內(nèi)視圖文件的名稱;傳遞到 view
輔助方法的第二個參數(shù)是一個能夠在視圖內(nèi)取用的數(shù)據(jù)數(shù)組。
當然,視圖文件也可以被存放在 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ù)給你的所有視圖,你有很多個選擇: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]);
通常你應該在服務提供者的 boot
方法內(nèi)使用 share
方法。你可以選擇加在 AppServiceProvider
或者是新建一個單獨的服務提供者來容納這些代碼。
備注: 當 view 輔助方法沒有帶入任何參數(shù)調(diào)用時,它將會返回一個的 Illuminate\Contracts\View\Factory 合約 (contract) 的實現(xiàn) (implementation)。
如果你需要確認視圖是否存在,使用 exists
方法:
if (view()->exists('emails.customer'))
{
//
}
你可以從一個完整的文件路徑來產(chǎn)生一個視圖:
return view()->file($pathToFile, $data);
視圖組件就是在視圖被渲染前,會調(diào)用的閉包或類方法。如果你想在每次渲染某些視圖時綁定數(shù)據(jù),視圖組件可以把這樣的程序邏輯組織在同一個地方。
定義一個視圖組件
讓我們在 服務提供者 內(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()
{
});
}
/**
* Register
*
* @return void
*/
public function register()
{
//
}
}
備注: Laravel 沒有默認的文件夾來放置類形式的視圖組件。你可以自由的把它們放在你想要的地方。舉例來說,你可以放在 App\Http\ViewComposers 文件夾內(nèi)。
記得要把這個服務提供者添加到 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
。
備注: 所有的視圖組件會被 服務容器 (service container) 解析,所以你需要在視圖組件的構(gòu)造器類型限制你所需的任何依賴參數(shù)。
View
的 composer
方法可以接受 * 作為通配符,所以你可以對所有視圖附加 composer
如下:
View::composer('*', function()
{
//
});
你也可以同時針對多個視圖附加同一個視圖組件:
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');