# 基礎 —— 視圖
## 1、基本使用
視圖并將應用的控制器邏輯和表現邏輯進行分離。視圖文件存放在`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`目錄下相應的視圖文件的名字,第二個參數是一個數組,該數組包含了在該視圖中所有有效的數據。在這個例子中,我們傳遞了一個`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`實例,從而可以調用該工廠的所有方法。
### 1.1 視圖數據
### 1.1.1 傳遞數據到視圖
在上述例子中可以看到,我們可以簡單通過數組方式將數據傳遞到視圖:
~~~
return view('greetings', ['name' => 'Victoria']);
~~~
以這種方式傳遞數據的話,`$data`應該是一個鍵值對數組,在視圖中,就可以使用相應的鍵來訪問數據值,比如`<?php?echo?$key;??>`。除此之外,還可以通過`with`方法添加獨立的數據片段到視圖:
~~~
$view = view('greeting')->with('name', 'Victoria');
~~~
### 1.1.2 在視圖間共享數據
有時候我們需要在所有視圖之間共享數據片段,這時候可以使用視圖工廠的`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()
{
//
}
}
~~~
## 2、視圖Composer
視圖Composers是當視圖被渲染時的回調或類方法。如果你有一些數據要在視圖每次渲染時都做綁定,可以使用視圖composer將邏輯組織到一個單獨的地方。
首先要在[服務提供者](http://laravelacademy.org/post/91.html)中注冊視圖Composer,我們將會使用幫助函數`view`來訪問`Illuminate\Contracts\View\Factory`的底層實現,記住,Laravel不會包含默認的視圖Composers目錄,我們可以按照自己的喜好組織其位置,例如可以創建一個`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`方法來綁定數據到視圖。
> 注意:所有視圖composers都通過[服務容器](http://laravelacademy.org/post/93.html)被解析,所以你可以在composer的構造函數中聲明任何你需要的依賴。
**添加Composer到多個視圖**
你可以傳遞視圖數組作為composer方法的第一個參數來一次性將視圖composer添加到多個視圖:
~~~
view()->composer(
['profile', 'dashboard'],
'App\Http\ViewComposers\MyViewComposer'
);
~~~
`composer`方法接受`*`通配符,從而允許將一個composer添加到所有視圖:
~~~
view()->composer('*', function ($view) {
//
});
~~~
### 2.1 視圖創建器
視圖創建器和視圖composer非常類似,不同之處在于前者在視圖實例化之后立即失效而不是等到視圖即將渲染。使用`create`方法注冊一個視圖創建器:
~~~
view()->creator('profile', 'App\Http\ViewCreators\ProfileCreator');
~~~
> 擴展閱讀:[實例教程 ——?在視圖間共享數據及視圖Composer](http://laravelacademy.org/post/697.html)
- 前言
- 序言
- 序言 ―― 發行版本說明
- 序言 ―― 升級指南
- 序言 ―― 貢獻代碼
- 開始
- 開始 ―― 安裝及配置
- 開始 ―― Laravel Homestead
- 基礎
- 基礎 ―― HTTP路由
- 基礎 ―― HTTP 中間件
- 基礎 ―― HTTP 控制器
- 基礎 ―― HTTP 請求
- 基礎 ―― HTTP 響應
- 基礎 ―― 視圖
- 基礎 ―― Blade模板
- 架構
- 架構 ―― 一次請求的生命周期
- 架構 ―― 應用目錄結構
- 架構 ―― 服務提供者
- 架構 ―― 服務容器
- 架構 ―― 契約
- 架構 ―― 門面
- 數據庫
- 數據庫 ―― 起步
- 數據庫 ―― 查詢構建器
- 數據庫 ―― 遷移
- 數據庫 ―― 填充數據
- Eloquent ORM
- Eloquent ORM ―― 起步
- Eloquent ORM ―― 關聯關系
- Eloquent ORM ―― 集合
- Eloquent ORM ―― 調整器
- Eloquent ORM ―― 序列化
- 服務
- 服務 ―― 用戶認證
- 服務 ―― Artisan 控制臺
- 服務 ―― Laravel Cashier(交易)
- 服務 ―― 緩存
- 服務 ―― 集合
- 服務 ―― Laravel Elixir
- 服務 ―― 加密
- 服務 ―― 錯誤&日志
- 服務 ―― 事件
- 服務 ―― 文件系統/云存儲
- 服務 ―― 哈希
- 服務 ―― 幫助函數
- 服務 ―― 本地化
- 服務 ―― 郵件
- 服務 ―― 包開發
- 服務 ―― 分頁
- 服務 ―― 隊列
- 服務 ―― Redis
- 服務 ―― Session
- 服務 ―― Envoy 任務運行器(SSH任務)
- 服務 ―― 任務調度
- 服務 ―― 測試
- 服務 ―― 驗證