[TOC]
### **1、基本使用**
[視圖](http://laravelacademy.org/tags/%e8%a7%86%e5%9b%be "View all posts in 視圖")包含應用的 HTML 代碼并將應用的控制器邏輯和表現邏輯進行分離。視圖文件存放在?`resources/views`?目錄。
下面是一個簡單視圖:
~~~
<!-- 該視圖存放 resources/views/greeting.php -->
<html>
<body>
<h1>Hello, <?php echo $name; ?></h1>
</body>
</html>
~~~
由于這個視圖存放在?`resources/views/greeting.php`,我們可以在全局的輔助函數?`view`?中這樣返回它:
~~~
Route::get('/', function () {
return view('greeting', ['name' => 'James']);
});
~~~
正如你所看到的,傳遞給?`view`?方法的第一個參數是?`resources/views`?目錄下相應的視圖文件的名字,第二個參數是一個數組,該數組包含了在該視圖中所有有效的[數據](http://laravelacademy.org/tags/%e6%95%b0%e6%8d%ae "View all posts in 數據")。在這個例子中,我們傳遞了一個?`name`?變量,在視圖中通過執行?`echo`?將其顯示出來。
當然,視圖還可以嵌套在?`resources/views`?的子目錄中,用“.”號來引用嵌套視圖,比如,如果視圖存放路徑是`resources/views/admin/profile.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']);
~~~
以這種方式傳遞數據的話,`$data`?應該是一個鍵值對數組,在視圖中,就可以使用相應的鍵來訪問數據值,比如?`<?php echo $key; ?>`。除此之外,還可以通過?`with`?方法添加獨立的數據片段到視圖:
~~~
$view = view('greeting')->with('name', 'Victoria');
~~~
#### **在視圖間[共享](http://laravelacademy.org/tags/%e5%85%b1%e4%ba%ab "View all posts in 共享")數據**
有時候我們需要在所有視圖之間共享數據片段,這時候可以使用視圖工廠的?`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](http://laravelacademy.org/tags/composer "View all posts in Composer")**
視圖 Composer 是當視圖被渲染時的回調或類方法。如果你有一些數據要在視圖每次渲染時都做綁定,可以使用視圖 Composer 將邏輯組織到一個單獨的地方。
首先要在服務提供者中注冊視圖 Composer,我們將會使用輔助函數?`view`?來訪問`Illuminate\Contracts\View\Factory`?的底層實現,記住,[Laravel](http://laravelacademy.org/tags/laravel "View all posts in Laravel")?不會包含默認的視圖 Composer 目錄,我們可以按照自己的喜好組織其路徑,例如可以創建一個?`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) {
});
}
/**
* 注冊服務提供者.
*
* @return void
*/
public function register()
{
//
}
}
~~~
如果創建一個新的服務提供者來包含視圖 Composer 注冊,需要添加該服務提供者到配置文件?`config/app.php`?的`providers`?數組中。
現在我們已經注冊了 Composer,每次?`profile`?視圖被渲染時都會執行?`ProfileComposer@compose`,接下來我們來定義該 Composer 類:
~~~
<?php
namespace App\Http\ViewComposers;
use Illuminate\Contracts\View\View;
use Illuminate\Users\Repository as 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\Contracts\View\View`?被注入該方法,從而可以使用其?`with`?方法來綁定數據到視圖。
> 注意:所有視圖 Composer 都通過服務容器被解析,所以你可以在 Composer 類的構造函數中聲明任何你需要的依賴。
#### **添加 Composer 到多個視圖**
你可以傳遞視圖數組作為?`composer`?方法的第一個參數來一次性將視圖 Composer 添加到多個視圖:
~~~
view()->composer(
['profile', 'dashboard'],
'App\Http\ViewComposers\MyViewComposer'
);
~~~
`composer`?方法接受?`*`?通配符,從而允許將一個 Composer 添加到所有視圖:
~~~
view()->composer('*', function ($view) {
//
});
~~~
### **4、視圖創建器**
視圖創建器和視圖 Composer 非常類似,不同之處在于前者在視圖實例化之后立即失效而不是等到視圖即將渲染。使用?`create`?方法即可注冊一個視圖創建器:
~~~
view()->creator('profile', 'App\Http\ViewCreators\ProfileCreator');
~~~
- 序言
- 發行版本說明
- 升級指南
- 貢獻代碼
- 開始
- 安裝
- 配置
- Laravel Homestead
- 基礎
- HTTP 路由
- HTTP 中間件
- HTTP 控制器
- HTTP 請求
- HTTP 響應
- 視圖
- Blade 模板引擎
- 架構
- 一次請求的生命周期
- 應用目錄結構
- 服務提供者
- 服務容器
- 門面(Facades)
- 數據庫
- 起步
- 查詢構建器
- 遷移
- 填充數據
- Eloquent ORM
- 起步
- 關聯關系
- 集合
- 訪問器&修改器
- 序列化
- 服務
- 用戶認證
- 用戶授權
- Artisan Console
- 訂閱支付實現:Laravel Cashier
- 緩存
- 集合
- 集成前端資源:Laravel Elixir
- 加密
- 錯誤&日志
- 事件
- 文件系統/云存儲
- 哈希
- 輔助函數
- 本地化
- 郵件
- 包開發
- 分頁
- Redis
- 隊列
- Session
- Envoy Task Runner
- 任務調度
- 測試
- 驗證
- 新手入門指南
- 簡單任務管理系統
- 帶用戶功能的任務管理系統