鍍金池/ 教程/ PHP/ 視圖
門面
Laravel Homestead
安裝及配置
測試
HTTP 中間件
加密
升級指南
幫助函數(shù)
應(yīng)用目錄結(jié)構(gòu)
集合
新手入門指南-簡單任務(wù)管理系統(tǒng)
任務(wù)調(diào)度
查詢構(gòu)建器
視圖
驗證
Laravel Cashier(訂購&支付&發(fā)票)
本地化
隊列
調(diào)整器
分頁
文件系統(tǒng)/云存儲
貢獻代碼
哈希
HTTP 控制器
緩存
遷移
HTTP 請求
Laravel Elixir
發(fā)行版本說明
Envoy 任務(wù)運行器(SSH任務(wù))
序列化
Session
起步
帶用戶功能的任務(wù)管理系統(tǒng)
起步
用戶授權(quán)
郵件
事件
填充數(shù)據(jù)
HTTP 路由
服務(wù)提供者
Blade 模板引擎
包開發(fā)
用戶認證
Artisan 控制臺
HTTP 響應(yīng)
集合
服務(wù)容器
關(guān)聯(lián)關(guān)系
一次請求的生命周期
契約
Redis
錯誤&日志

視圖

1、基本使用

視圖包含服務(wù)于應(yīng)用的 HTML 并將應(yīng)用的控制器邏輯和表現(xiàn)邏輯進行分離。視圖文件存放在 resources/views 目錄。 下面是一個簡單視圖:

<!-- 該視圖存放 resources/views/greeting.php -->

<html>
    <body>
        <h1>Hello, <?php echo $name; ?></h1>
    </body>
</html>

這個視圖存放在 resources/views/greeting.php,我們可以在全局的幫助函數(shù) view 中這樣返回它:

Route::get('/', function ()    {
    return view('greeting', ['name' => 'James']);
});

傳遞給 view 方法的第一個參數(shù)是 resources/views 目錄下相應(yīng)的視圖文件的名字,第二個參數(shù)是一個數(shù)組,該數(shù)組包含了在該視圖中所有有效的數(shù)據(jù)。在這個例子中,我們傳遞了一個 name 變量,在視圖中通過執(zhí)行 echo 將其顯示出來。 當然,視圖還可以嵌套在 resources/views 的子目錄中,用“.”號來引用嵌套視圖,比如,如果視圖存放路徑是 resources/views/admin/profile.php,那我們可以這樣引用它:

return view('admin.profile', $data);

判斷視圖是否存在 如果需要判斷視圖是否存在,可調(diào)用不帶參數(shù)的 view 之后再使用 exists 方法,如果視圖在磁盤存在則返回 true

if (view()->exists('emails.customer')) {
    //
}

調(diào)用不帶參數(shù)的 view 時,將會返回一個 Illuminate\Contracts\View\Factory 實例,從而可以調(diào)用該工廠的所有方法。

1.1 視圖數(shù)據(jù)

1.1.1 傳遞數(shù)據(jù)到視圖

在上述例子中可以看到,我們可以簡單通過數(shù)組方式將數(shù)據(jù)傳遞到視圖:

return view('greetings', ['name' => 'Victoria']);

以這種方式傳遞數(shù)據(jù)的話,$data 應(yīng)該是一個鍵值對數(shù)組,在視圖中,就可以使用相應(yīng)的鍵來訪問數(shù)據(jù)值,比如<?php echo $key; ?>。除此之外,還可以通過 with 方法添加獨立的數(shù)據(jù)片段到視圖:

$view = view('greeting')->with('name', 'Victoria');

1.1.2 在視圖間共享數(shù)據(jù)

有時候我們需要在所有視圖之間共享數(shù)據(jù)片段,這時候可以使用視圖工廠的 share 方法,通常,需要在服務(wù)提供者的boot 方法中調(diào)用 share 方法,你可以將其添加到 AppServiceProvider 或生成獨立的服務(wù)提供者來存放它們:

<?php

namespace App\Providers;

class AppServiceProvider extends ServiceProvider
{
    /**
     * 啟動所有應(yīng)用服務(wù)
     *
     * @return void
     */
    public function boot()
    {
        view()->share('key', 'value');
    }

    /**
     * 注冊服務(wù)提供者
     *
     * @return void
     */
    public function register()
    {
        //
    }
}

2、視圖 Composer

視圖 Composers 是當視圖被渲染時的回調(diào)或類方法。如果你有一些數(shù)據(jù)要在視圖每次渲染時都做綁定,可以使用視圖 composer 將邏輯組織到一個單獨的地方。

首先要在服務(wù)提供者中注冊視圖 Composer,我們將會使用幫助函數(shù) view 來訪問 Illuminate\Contracts\View\Factory的底層實現(xiàn),記住,Laravel 不會包含默認的視圖 Composers 目錄,我們可以按照自己的喜好組織其位置,例如可以創(chuàng)建一個 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) {

        });
    }

    /**
     * 注冊服務(wù)提供者.
     *
     * @return void
     */
    public function register()
    {
        //
    }
}

如果創(chuàng)建一個新的服務(wù)提供者來包含視圖 composer 注冊,需要添加該服務(wù)提供者到配置文件 config/app.phpproviders 數(shù)組中。 現(xiàn)在我們已經(jīng)注冊了 composer,每次 profile 視圖被渲染時都會執(zhí)行 ProfileComposer@compose,接下來我們來定義該 composer 類:

<?php

namespace App\Http\ViewComposers;

use Illuminate\Contracts\View\View;
use Illuminate\Users\Repository as UserRepository;

class ProfileComposer
{
    /**
     * 用戶倉庫實現(xiàn).
     *
     * @var UserRepository
     */
    protected $users;

    /**
     * 創(chuàng)建一個新的屬性 composer.
     *
     * @param  UserRepository  $users
     * @return void
     */
    public function __construct(UserRepository $users)
    {
        // Dependencies automatically resolved by service container...
        $this->users = $users;
    }

    /**
     * 綁定數(shù)據(jù)到視圖.
     *
     * @param  View  $view
     * @return void
     */
    public function compose(View $view)
    {
        $view->with('count', $this->users->count());
    }
}

視圖被渲染前,composer 的 compose 方法被調(diào)用,同時 Illuminate\Contracts\View\View 被注入,可使用其with方法來綁定數(shù)據(jù)到視圖。 注意:所有視圖 composers 都通過服務(wù)容器被解析,所以你可以在 composer 的構(gòu)造函數(shù)中聲明任何你需要的依賴。 添加 Composer 到多個視圖 你可以傳遞視圖數(shù)組作為 composer 方法的第一個參數(shù)來一次性將視圖 composer 添加到多個視圖:

view()->composer(
    ['profile', 'dashboard'],
    'App\Http\ViewComposers\MyViewComposer'
);

composer方法接受*通配符,從而允許將一個 composer 添加到所有視圖:

view()->composer('*', function ($view) {
    //
});

2.1 視圖創(chuàng)建器

視圖創(chuàng)建器和視圖 composer 非常類似,不同之處在于前者在視圖實例化之后立即失效而不是等到視圖即將渲染。使用create方法注冊一個視圖創(chuàng)建器:

view()->creator('profile', 'App\Http\ViewCreators\ProfileCreator');
上一篇:集合下一篇:服務(wù)容器