# 視圖
- [創建視圖](#creating-views)
- [傳遞數據到視圖](#passing-data-to-views)
- [把數據共享給所有視圖](#sharing-data-with-all-views)
- [視圖合成器](#view-composers)
<a name="creating-views"></a>
## 創建視圖
視圖的用途是用來存放應用程序中 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 模板語言](/docs/{{version}}/blade) 打印出來。
當然,視圖文件也可能存放在 `resources/views` 的子目錄中,你可以使用英文句點 `.` 來引用深層子目錄中的視圖文件。例如,一個視圖的位置為 `resources/views/admin/profile.php` ,使用示例如下:
return view('admin.profile', $data);
#### 判斷視圖文件是否存在
如果需要測試一個視圖文件是否存在,你可以使用 `View` Facade 上的 `exists` 方法來判定,如果測試的視圖文件存在,則返回值為 `true` :
use Illuminate\Support\Facades\View;
if (View::exists('emails.customer')) {
//
}
<a name="passing-data-to-views"></a>
## 傳遞數據到視圖
如上述例子中,你可以使用數組將數據傳遞到視圖文件:
return view('greetings', ['name' => 'Victoria']);
當使用上面方式傳遞數據時,第二個參數( `$data` )必須是鍵值對數組。在視圖文件中,你可以通過對應的關鍵字( `$key` )取用相應的數據值,例如 `<?php echo $key; ?>`。如果只需要傳遞特定數據而非一個臃腫的數組到視圖文件,可以使用 `with` 輔助函數,示例如下:
return view('greeting')->with('name', 'Victoria');
<a name="sharing-data-with-all-views"></a>
#### 把數據共享給所有視圖
有時候可能需要共享特定的數據給應用程序中所有的視圖,那這時候你需要 `View` Facade 的 `share` 方法。通常需要將所有 `share` 方法的調用代碼放到 [服務提供者](/docs/{{version}}/providers) 的 `boot` 方法中,此時你可以選擇使用 `AppServiceProvider` 或創建獨立的 [服務提供者](/docs/{{version}}/providers) 。示例代碼如下:
<?php
namespace App\Providers;
use Illuminate\Support\Facades\View;
class AppServiceProvider extends ServiceProvider
{
/**
* Bootstrap any application services.
*
* @return void
*/
public function boot()
{
View::share('key', 'value');
}
/**
* Register the service provider.
*
* @return void
*/
public function register()
{
//
}
}
<a name="view-composers"></a>
## 視圖合成器
視圖合成器是在視圖渲染時調用的一些回調或者類方法。如果你需要在某些視圖渲染時綁定一些數據上去,那么視圖合成器就是你的的不二之選,另外他還可以幫你將這些綁定邏輯整理到特定的位置。
下面例子中,我們會在一個 [服務提供者](/docs/{{version}}/providers) 中注冊一些視圖合成器。同時使用 `View` Facade 來訪問 `Illuminate\Contracts\View\Factory` contract 的底層實現。注意:Laravel 沒有存放視圖合成器的默認目錄,但你可以根據自己的喜好來重新組織,例如:`App\Http\ViewComposers`。
<?php
namespace App\Providers;
use Illuminate\Support\Facades\View;
use Illuminate\Support\ServiceProvider;
class ComposerServiceProvider extends ServiceProvider
{
/**
* Register bindings in the container.
*
* @return void
*/
public function boot()
{
// Using class based composers...
View::composer(
'profile', 'App\Http\ViewComposers\ProfileComposer'
);
// Using Closure based composers...
View::composer('dashboard', function ($view) {
//
});
}
/**
* Register the service provider.
*
* @return void
*/
public function register()
{
//
}
}
> {note} 注意,如果你創建了新的一個 [服務提供者](/docs/{{version}}/providers) 來存放你視圖合成器的注冊項,那么你需要將這個 [服務提供者](/docs/{{version}}/providers) 添加到配置文件 `config/app.php` 的 `providers` 數組中。
到此我們已經注冊了上面的視圖合成器,效果是每次 `profile` 視圖渲染時,都會執行 `ProfileComposer@compose` 方法。那么下面我們來定義這個合成器類吧。
<?php
namespace App\Http\ViewComposers;
use Illuminate\View\View;
use App\Repositories\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)
{
// Dependencies automatically resolved by service container...
$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` 方法都會被調用,并且傳入一個 `Illuminate\View\View` 實例作為參數,在這個過程中,你可以使用 `with` 方法綁定數據到目標視圖。
> {tip} 所有的視圖合成器都會由 [服務容器](/docs/{{version}}/container) 來解析,所以你可以在合成器的構造函數中使用類型提示來注入需要的任何依賴。
#### 將視圖合成器附加到多個視圖
通過將目標視圖文件數組作為第一個參數傳入 `composer` 方法,你可以把一個視圖合成器同時附加到多個視圖。
View::composer(
['profile', 'dashboard'],
'App\Http\ViewComposers\MyViewComposer'
);
`composer` 方法同時也接受通配符 `*` ,可以讓你將一個視圖合成器一次性綁定到所有的視圖:
View::composer('*', function ($view) {
//
});
#### 視圖塑造器
視圖 **塑造器** 和視圖合成器非常相似。不同之處在于:視圖塑造器在視圖實例化時執行,而視圖合成器在視圖渲染時執行。如下,可以使用 `creator` 方法來注冊一個視圖塑造器:
View::creator('profile', 'App\Http\ViewCreators\ProfileCreator');
## 譯者署名
| 用戶名 | 頭像 | 職能 | 簽名 |
|---|---|---|---|
| [@zhwei](https://github.com/zhwei) | <img class="avatar-66 rm-style" src="https://avatars3.githubusercontent.com/u/1446459?v=3&s=100"> | 翻譯 | |
| [@summerblue](https://github.com/summerblue) | <img class="avatar-66 rm-style" src="https://avatars2.githubusercontent.com/u/324764?v=3&s=100"> | Review | A man seeking for Wisdom. |
| [@NauxLiu](https://github.com/NauxLiu) | <img class="avatar-66 rm-style" src="https://avatars3.githubusercontent.com/u/9570112?v=3&s=100"> | Review | |
- 說明
- 翻譯說明
- 發行說明
- 升級說明
- 貢獻導引
- 入門指南
- 安裝
- 配置信息
- 文件夾結構
- 錯誤與日志
- 開發環境
- HomeStead
- Valet
- 核心概念
- 服務容器
- 服務提供者
- 門面(facades)
- contracts
- HTTP層
- 路由
- 中間件
- CSRF保護
- 控制器
- 請求
- 響應
- Session
- 表單驗證
- 視圖與模板
- 視圖
- Blade模板
- 本地化
- Javascript與CSS
- 入門指南
- laravel-elixir
- 安全
- 用戶認證
- 用戶授權
- 重置密碼
- API授權
- 加密解密
- 哈希
- 綜合話題
- 廣播系統
- 緩存系統
- 事件系統
- 文件存儲
- 郵件發送
- 消息通知
- 隊列
- 數據庫
- 快速入門
- 查詢構造器
- 分頁
- 數據庫遷移
- 數據填充
- redis
- Eloquent ORM
- 快速入門
- 模型關聯
- Eloquent集合
- 修改器
- 序列化
- Artisan控制臺
- Artisan 命令行
- 任務調度
- 測試
- 快速入門
- 應用程序測試
- 數據庫測試
- 模擬器
- 官方擴展包
- Cashier交易包
- Envoy 部署工具
- Passport OAuth 認證
- Scout 全文搜索
- Socialite 社交化登錄
- 附錄
- 集合
- 輔助函數
- 擴展包開發
- 交流說明