視圖并將應(yīng)用的控制器邏輯和表現(xiàn)邏輯進行分離。視圖文件存放在resources/views
目錄。
下面是一個簡單視圖:
<!-- 該視圖存放 resources/views/greeting.php -->
<html>
<body>
<h1>Hello, <?php echo $name; ?></h1>
</body>
</html>
這個視圖存放在resources/views/greeting.php
,我們可以在全局的幫助函數(shù)view
中這樣返回它:
Route::get('/', function () {
return view('greeting', ['name' => 'James']);
});
傳遞給view
方法的第一個參數(shù)是resources/views
目錄下相應(yīng)的視圖文件的名字,第二個參數(shù)是一個數(shù)組,該數(shù)組包含了在該視圖中所有有效的數(shù)據(jù)。在這個例子中,我們傳遞了一個name
變量,在視圖中通過執(zhí)行echo
將其顯示出來。
當(dāng)然,視圖還可以嵌套在resources/views
的子目錄中,用“.”號來引用嵌套視圖,比如,如果視圖存放路徑是resources/views/admin/profile.php
,那我們可以這樣引用它:
return view('admin.profile', $data);
判斷視圖是否存在
如果需要判斷視圖是否存在,可調(diào)用不帶參數(shù)的view
之后再使用exists
方法,如果視圖在磁盤存在則返回true
:
if (view()->exists('emails.customer')) {
//
}
調(diào)用不帶參數(shù)的view
時,將會返回一個Illuminate\Contracts\View\Factory
實例,從而可以調(diào)用該工廠的所有方法。
在上述例子中可以看到,我們可以簡單通過數(shù)組方式將數(shù)據(jù)傳遞到視圖:
return view('greetings', ['name' => 'Victoria']);
以這種方式傳遞數(shù)據(jù)的話,$data
應(yīng)該是一個鍵值對數(shù)組,在視圖中,就可以使用相應(yīng)的鍵來訪問數(shù)據(jù)值,比如<?php?echo?$key;??>
。除此之外,還可以通過with
方法添加獨立的數(shù)據(jù)片段到視圖:
$view = view('greeting')->with('name', 'Victoria');
有時候我們需要在所有視圖之間共享數(shù)據(jù)片段,這時候可以使用視圖工廠的share
方法,通常,需要在服務(wù)提供者的boot
方法中調(diào)用share
方法,你可以將其添加到AppServiceProvider
或生成獨立的服務(wù)提供者來存放它們:
<?php
namespace App\Providers;
class AppServiceProvider extends ServiceProvider
{
/**
* 啟動所有應(yīng)用服務(wù)
*
* @return void
*/
public function boot()
{
view()->share('key', 'value');
}
/**
* 注冊服務(wù)提供者
*
* @return void
*/
public function register()
{
//
}
}
視圖Composers是當(dāng)視圖被渲染時的回調(diào)或類方法。如果你有一些數(shù)據(jù)要在視圖每次渲染時都做綁定,可以使用視圖composer將邏輯組織到一個單獨的地方。
首先要在服務(wù)提供者中注冊視圖Composer,我們將會使用幫助函數(shù)view
來訪問Illuminate\Contracts\View\Factory
的底層實現(xiàn),記住,Laravel不會包含默認(rèn)的視圖Composers目錄,我們可以按照自己的喜好組織其位置,例如可以創(chuàng)建一個App\Http\ViewComposers
目錄:
<?php
namespace App\Providers;
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) {
});
}
/**
* 注冊服務(wù)提供者.
*
* @return void
*/
public function register()
{
//
}
}
如果創(chuàng)建一個新的服務(wù)提供者來包含視圖composer注冊,需要添加該服務(wù)提供者到配置文件config/app.php
的providers
數(shù)組中。
現(xiàn)在我們已經(jīng)注冊了composer,每次profile視圖被渲染時都會執(zhí)行ProfileComposer@compose
,接下來我們來定義該composer類:
<?php
namespace App\Http\ViewComposers;
use Illuminate\Contracts\View\View;
use Illuminate\Users\Repository as UserRepository;
class ProfileComposer
{
/**
* 用戶倉庫實現(xiàn).
*
* @var UserRepository
*/
protected $users;
/**
* 創(chuàng)建一個新的屬性composer.
*
* @param UserRepository $users
* @return void
*/
public function __construct(UserRepository $users)
{
// Dependencies automatically resolved by service container...
$this->users = $users;
}
/**
* 綁定數(shù)據(jù)到視圖.
*
* @param View $view
* @return void
*/
public function compose(View $view)
{
$view->with('count', $this->users->count());
}
}
視圖被渲染前,composer的compose
方法被調(diào)用,同時Illuminate\Contracts\View\View
被注入,可使用其with
方法來綁定數(shù)據(jù)到視圖。
注意:所有視圖composers都通過服務(wù)容器被解析,所以你可以在composer的構(gòu)造函數(shù)中聲明任何你需要的依賴。
添加Composer到多個視圖
你可以傳遞視圖數(shù)組作為composer方法的第一個參數(shù)來一次性將視圖composer添加到多個視圖:
view()->composer(
['profile', 'dashboard'],
'App\Http\ViewComposers\MyViewComposer'
);
composer
方法接受*
通配符,從而允許將一個composer添加到所有視圖:
view()->composer('*', function ($view) {
//
});
視圖創(chuàng)建器和視圖composer非常類似,不同之處在于前者在視圖實例化之后立即失效而不是等到視圖即將渲染。使用create
方法注冊一個視圖創(chuàng)建器:
view()->creator('profile', 'App\Http\ViewCreators\ProfileCreator');
更多建議: