視圖 (View)
基本用法
視圖裡面包含了你應用程式所提供的 HTML 代碼,并且提供一個簡單的方式來分離控制器和網頁呈現上的邏輯。視圖被儲存在 resources/views 檔案夾内。
一個簡單的視圖看起來可能像這樣:
Hello, <?php echo $name; ?>
這個視圖可以使用以下的代碼傳遞到使用者的浏覽器:
Route::get('/', function()
{
return view('greeting', ['name' => 'James']);
});
如你所見,view 輔助方法的第一個參數會對應到 resources/views 檔案夾内視圖檔案的名稱;傳遞到 view 輔助方法的第二個參數是一個能夠在視圖内取用的資料數組。
當然,視圖檔案也可以被存放在 resources/views 的子檔案夾内。舉例來說,如果你的視圖檔案儲存在 resources/views/admin/profile.php,你可以用以下的代碼來傳回:
return view('admin.profile', $data);
傳遞資料到視圖
// 使用傳統的方法
$view = view('greeting')->with('name', 'Victoria');
// 使用魔術方法
$view = view('greeting')->withName('Victoria');
在上面的例子代碼中,視圖将可以使用 $name 來取得資料,其值為 Victoria。
如果你想的話,還有一種方式就是直接在 view 輔助方法的第二個參數直接傳遞一個數組:
$view = view('greetings', $data);
把資料共享給所有視圖
有時候你可能需要共享一些資料給你的所有視圖,你有很多個選擇:view 輔助方法;Illuminate\Contracts\View\Factory合約 (contract);在 視圖元件 (view composer) 内使用通配符。
這裡有個 view 輔助方法的例子:
view()->share('data', [1, 2, 3]);
你也可以使用 view 的 Facade:
View::share('data', [1, 2, 3]);
通常你應該在服務提供者的 boot 方法内使用 share 方法。你可以選擇加在 AppServiceProvider 或者是建立一個單獨的服務提供者來容納這些代碼。
備注: 當 view 輔助方法沒有帶入任何參數調用時,它将會傳回一個的 Illuminate\Contracts\View\Factory 合約 (contract) 的實作 (implementation)。
确認視圖是否存在
如果你需要确認視圖是否存在,使用 exists 方法:
if (view()->exists('emails.customer'))
{
//
}
從一個檔案路徑産生視圖
你可以從一個完整的檔案路徑來産生一個視圖:
return view()->file($pathToFile, $data);
視圖元件
視圖元件就是在視圖被渲染前,會調用的閉包或類方法。如果你想在每次渲染某些視圖時綁定資料,視圖元件可以把這樣的程式邏輯組織在同一個地方。
定義一個視圖元件
讓我們在 服務提供者 内組織我們的視圖元件。底下例子将使用 View Facade 來取得底層 Illuminate\Contracts\View\Factory合約的實作:
use View;
use Illuminate\Support\ServiceProvider;
class ComposerServiceProvider extends ServiceProvider {
public function boot()
{
// 使用類來指定視圖元件
View::composer('profile', 'App\Http\ViewComposers\ProfileComposer');
// 使用閉包來指定視圖元件
View::composer('dashboard', function()
{
});
}
public function register()
{
//
}
}
備注: Laravel 沒有預設的檔案夾來放置類形式的視圖元件。你可以自由的把它們放在你想要的地方。舉例來說,你可以放在 App\Http\ViewComposers 檔案夾内。
記得要把這個服務提供者添加到 config/app.php 配置檔案的 providers 數組中。
現在我們已經注冊了視圖元件,并且在每次 profile 視圖渲染的時候,[email protected] 都将會被執行。接下來我們來看看這個類要如何定義:
use Illuminate\Contracts\View\View;
use Illuminate\Users\Repository as UserRepository;
class ProfileComposer {
protected $users;
public function __construct(UserRepository $users)
{
// service container 會自動解析所需的參數
$this->users = $users;
}
public function compose(View $view)
{
$view->with('count', $this->users->count());
}
}
在視圖被渲染之前,視圖元件的 compose 方法就會被調用,并且傳入一個 Illuminate\Contracts\View\View 執行個體。你可以使用 with 方法來把資料綁定到 view。
備注: 所有的視圖元件會被 服務容器 (service container) 解析,是以你需要在視圖元件的構造器類型限制你所需的任何依賴參數。
在視圖元件内使用通配符
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'
]);
視圖建立者
視圖 建立者 幾乎和視圖元件運作方式一樣;隻是視圖建立者會在視圖初始化後就立刻執行。要注冊一個建立者,隻要使用 creator 方法:
View::creator('profile', 'App\Http\ViewCreators\ProfileCreator');