1、創建視圖
視圖包含應用的 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' => 'James']);
});
正如你所看到的,傳遞給 view 方法的第一個參數是 resources/views 目錄下相應的視圖文件的名字,第二個參數是一個數組,該數組包含了在該視圖中所有有效的數據。在這個例子中,我們傳遞了一個 name 變量,在視圖中通過使用 Blade 語法將其顯示出來。
當然,視圖還可以嵌套在 resources/views 的子目錄中,用“.”號來引用嵌套視圖,比如,如果視圖存放路徑是 resources/views/admin/profile.blade.php,那我們可以這樣引用它:
return view('admin.profile', $data);
判斷視圖是否存在
如果需要判斷視圖是否存在,可在調用不帶參數的 view 之後使用 exists 方法,如果視圖在磁盤存在則返回 true:
if (view()->exists('emails.customer')) {
//
}
調用不帶參數的 view 時,將會返回一個 Illuminate\Contracts\View\Factory 實例,從而可以調用該工廠上的所有方法。
2、傳遞數據到視圖
在上述例子中可以看到,我們可以簡單通過數組方式將數據傳遞到視圖:
return view('greetings', ['name' => 'Victoria']);
以這種方式傳遞數據的話,
$view = view('greeting')->with('name', 'Victoria');
在視圖間共享數據
有時候我們需要在所有視圖之間共享數據片段,這時候可以使用視圖工廠的 share 方法,通常,需要在服務提供者的 boot 方法中調用 share 方法,你可以將其添加到 AppServiceProvider 或生成獨立的服務提供者來存放它們:
<?php
namespace App\Providers;
class AppServiceProvider extends ServiceProvider
{
/**
* 啓動所有應用服務
*
* @return void
*/
public function boot()
{
view()->share('key', 'value');
}
/**
* 註冊服務提供者
*
* @return void
*/
public function register()
{
//
}
}
3、視圖Composer
視圖 Composer 是當視圖被渲染時的回調或類方法。如果你有一些數據要在視圖每次渲染時都做綁定,可以使用視圖 Composer 將邏輯組織到一個單獨的地方。
首先要在服務提供者中註冊視圖 Composer,我們將會使用輔助函數 view 來訪問 Illuminate\Contracts\View\Factory 的底層實現,記住,Laravel 不會包含默認的視圖 Composer 目錄,我們可以按照自己的喜好組織其路徑,例如可以創建一個 App\Http\ViewComposers 目錄:
<?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)
{
// Dependencies automatically resolved by service container...
$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 非常類似,不同之處在於前者在視圖實例化之後立即失效而不是等到視圖即將渲染。使用 creator 方法即可註冊一個視圖創建器:
View::creator('profile', 'App\Http\ViewCreators\ProfileCreator');