* * * * *
[TOC]
## 創建視圖
> {tip} 如果你想找到有關如何編寫 Blade 模板的更多信息?查看完整的?[Blade 文檔](http://www.hmoore.net/tonyyu/laravel_5_6/786198)?。
視圖包含應用程序的 HTML,并且將控制器/應用程序邏輯與演示邏輯分開。視圖文件存放于?`resources/views`?目錄下。一個簡單的視圖如下所示:
~~~
<!-- 此視圖文件位置:resources/views/greeting.blade.php -->
<html>
<body>
<h1>Hello, {{ $name }}</h1>
</body>
</html>
~~~
該視圖文件位于?`resources/views/greeting.blade.php`,使用全局輔助函數?`view`?來返回:
~~~
Route::get('/', function () {
return view('greeting', ['name' => 'James']);
});
~~~
如你所見,`view`?函數中,傳入的第一個參數對應著?`resources/views`?目錄中視圖文件的名稱,第二個參數是可在視圖文件中使用數組。在示例中,我們傳遞 name 變量,該變量可以使用?[Blade 模板語言](http://www.hmoore.net/tonyyu/laravel_5_6/786198)?在視圖中顯示。
當然,視圖文件也可以嵌套在?`resources/views`?目錄的子目錄中。「點」符號可以用來引用嵌套視圖。例如,如果你的視圖存儲在?`resources/views/admin/profile.blade.php`,則可以這樣引用它:
~~~
return view('admin.profile', $data);
~~~
#### 判斷視圖文件是否存在
如果需要判斷視圖文件是否存在,可以使用?`View`?Facade 上的?`exists`?方法。如果視圖文件存在,該方法會返回 true :
~~~
use Illuminate\Support\Facades\View;
if (View::exists('emails.customer')) {
//
}
~~~
#### 創建第一個可用視圖
使用?`first`?方法,你可以創建存在于給定數組視圖中的第一個視圖。 如果你的應用程序或開發的第三方包允許定制或覆蓋視圖,這非常有用:
~~~
return view()->first(['custom.admin', 'admin'], $data);
~~~
當然,你也可以通過?`View`?[facade](http://www.hmoore.net/tonyyu/laravel_5_6/786058)?調用這個方法:
~~~
use Illuminate\Support\Facades\View;
return View::first(['custom.admin', 'admin'], $data);
~~~
## 向視圖傳遞數據
如上述例子所示,你可以使用數組將數據傳遞到視圖:
~~~
return view('greetings', ['name' => 'Victoria']);
~~~
當用這種方式傳遞數據時,作為第二個參數的數據必須是鍵值對數組。在視圖文件中,你可以通過對應的鍵獲取相應的值,例如?`<?php echo $key; ?>`。作為將完整數據傳遞給輔助函數?`view`?的替代方法,你可以使用?`with`?方法將單個數據片段添加到視圖:
~~~
return view('greeting')->with('name', 'Victoria');
~~~
#### 與所有視圖共享數據
如果需要共享一段數據給應用程序的所有視圖,你可以在服務提供器的?`boot`?方法中調用視圖 Facade 的?`share`?方法。例如,可以將它們添加到?`AppServiceProvider`?或者為它們生成一個單獨的服務提供器:
~~~
<?php
namespace App\Providers;
use Illuminate\Support\Facades\View;
class AppServiceProvider extends ServiceProvider
{
/**
* 引導任何應用程序服務。
*
* @return void
*/
public function boot()
{
View::share('key', 'value');
}
/**
* 注冊服務提供商。
*
* @return void
*/
public function register()
{
//
}
}
~~~
## 視圖合成器
視圖合成器是在渲染視圖時調用的回調或者類方法。如果你每次渲染視圖時都要綁定視圖的數據,視圖合成器可以幫你將這些邏輯整理到特定的位置。
在下面這個例子中,我們會在一個?[服務提供商](http://www.hmoore.net/tonyyu/laravel_5_6/786057)?中注冊視圖合成器,使用?`View`?Facade 來訪問底層的?`Illuminate\Contracts\View\Factory`?契約實現。默認情況下,Laravel 沒有存放視圖合成器的目錄,你需要根據需求來重新建立目錄,例如:`App\Http\ViewComposers`。
~~~
<?php
namespace App\Providers;
use Illuminate\Support\Facades\View;
use Illuminate\Support\ServiceProvider;
class ComposerServiceProvider extends ServiceProvider
{
/**
* 在容器中注冊綁定。
*
* @return void
*/
public function boot()
{
// 使用基于類的 composer...
View::composer(
'profile', 'App\Http\ViewComposers\ProfileComposer'
);
// 使用基于閉包的 composers...
View::composer('dashboard', function ($view) {
//
});
}
/**
* 注冊服務器提供者。
*
* @return void
*/
public function register()
{
//
}
}
~~~
> {note} 注意,如果你創建了新的一個服務提供器來存放你注冊視圖合成器的代碼,那么你需要將這個服務提供器添加到配置文件?`config/app.php`?的?`providers`?數組中。
到此我們已經注冊了視圖合成器,每次渲染?`profile`?視圖時都會執行?`ProfileComposer@compose`?方法。那么下面我們來定義視圖合成器的這個類吧:
~~~
<?php
namespace App\Http\ViewComposers;
use Illuminate\View\View;
use App\Repositories\UserRepository;
class ProfileComposer
{
/**
* 用戶 repository 實現。
*
* @var UserRepository
*/
protected $users;
/**
* 創建一個新的 profile composer。
*
* @param UserRepository $users
* @return void
*/
public function __construct(UserRepository $users)
{
// 依賴關系由服務容器自動解析...
$this->users = $users;
}
/**
* 將數據綁定到視圖。
*
* @param View $view
* @return void
*/
public function compose(View $view)
{
$view->with('count', $this->users->count());
}
}
~~~
視圖合成器的?`compose`?方法會在視圖渲染之前被調用,并傳入一個?`Illuminate\View\View`?實例。你可以使用?`with`?方法將數據綁定到視圖。
> {tip} 所有的視圖合成器都會通過?[服務容器](http://www.hmoore.net/tonyyu/laravel_5_6/786056), 進行解析,所以你可以在視圖合成器的構造函數中類型提示需要注入的依賴項。
#### 將視圖構造器添加到多個視圖
通過將一組視圖作為第一個參數傳入?`composer`?方法,將一個視圖合成器添加到多個視圖:
~~~
View::composer(
['profile', 'dashboard'],
'App\Http\ViewComposers\MyViewComposer'
);
~~~
`composer`?方法同時也接受通配符?`*`,表示將一個視圖合成器添加到所有視圖:
~~~
View::composer('*', function ($view) {
//
});
~~~
#### 視圖構造器
視圖?**構造器**?和視圖合成器非常相似。唯一不同之處在于:視圖構造器在視圖實例化之后立即執行,而視圖合成器在視圖即將渲染時執行。使用?`creator`?方法注冊視圖構造器:
~~~
View::creator('profile', 'App\Http\ViewCreators\ProfileCreator');
~~~
- 前言
- 翻譯說明
- 發行說明
- 升級指南
- 貢獻導引
- 入門指南
- 安裝
- 配置信息
- 文件夾結構
- Homestead
- Valet
- 部署
- 核心架構
- 請求周期
- 服務容器
- 服務提供者
- Facades
- Contracts
- 基礎功能
- 路由
- 中間件
- CSRF 保護
- 控制器
- 請求
- 響應
- 視圖
- URL
- Session
- 表單驗證
- 錯誤
- 日志
- 前端開發
- Blade 模板
- 本地化
- 前端指南
- 編輯資源 Mix
- 安全相關
- 用戶認證
- Passport OAuth 認證
- 用戶授權
- 加密解密
- 哈希
- 重置密碼
- 綜合話題
- Artisan 命令行
- 廣播系統
- 緩存系統
- 集合
- 事件系統
- 文件存儲
- 輔助函數
- 郵件發送
- 消息通知
- 擴展包開發
- 隊列
- 任務調度
- 數據庫
- 快速入門
- 查詢構造器
- 分頁
- 數據庫遷移
- 數據填充
- Redis
- Eloquent ORM
- 快速入門
- 模型關聯
- Eloquent 集合
- 修改器
- API 資源
- 序列化
- 測試相關
- 快速入門
- HTTP 測試
- 瀏覽器測試 Dusk
- 數據庫測試
- 測試模擬器
- 官方擴展包
- Cashier 交易工具包
- Envoy 部署工具
- Horizon
- Scout 全文搜索
- Socialite 社會化登錄