基礎(chǔ) ―― 視圖

2018-02-24 15:38 更新

基礎(chǔ) —— 視圖

1、基本使用

視圖并將應(yīng)用的控制器邏輯和表現(xiàn)邏輯進(jìn)行分離。視圖文件存放在resources/views目錄。

下面是一個(gè)簡(jiǎn)單視圖:

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

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

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

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

傳遞給view方法的第一個(gè)參數(shù)是resources/views目錄下相應(yīng)的視圖文件的名字,第二個(gè)參數(shù)是一個(gè)數(shù)組,該數(shù)組包含了在該視圖中所有有效的數(shù)據(jù)。在這個(gè)例子中,我們傳遞了一個(gè)name變量,在視圖中通過(guò)執(zhí)行echo將其顯示出來(lái)。

當(dāng)然,視圖還可以嵌套在resources/views的子目錄中,用“.”號(hào)來(lái)引用嵌套視圖,比如,如果視圖存放路徑是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時(shí),將會(huì)返回一個(gè)Illuminate\Contracts\View\Factory實(shí)例,從而可以調(diào)用該工廠的所有方法。

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

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

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

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

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

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

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

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

<?php

namespace App\Providers;

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

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

2、視圖Composer

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

首先要在服務(wù)提供者中注冊(cè)視圖Composer,我們將會(huì)使用幫助函數(shù)view來(lái)訪問(wèn)Illuminate\Contracts\View\Factory的底層實(shí)現(xiàn),記住,Laravel不會(huì)包含默認(rèn)的視圖Composers目錄,我們可以按照自己的喜好組織其位置,例如可以創(chuàng)建一個(gè)App\Http\ViewComposers目錄:

<?php

namespace App\Providers;

use Illuminate\Support\ServiceProvider;

class ComposerServiceProvider extends ServiceProvider
{
    /**
     * 在容器中注冊(cè)綁定.
     *
     * @return void
     * @author http://laravelacademy.org
     */
    public function boot()
    {
        // 使用基于類的composers...
        view()->composer(
            'profile', 'App\Http\ViewComposers\ProfileComposer'
        );

        // 使用基于閉包的composers...
        view()->composer('dashboard', function ($view) {

        });
    }

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

如果創(chuàng)建一個(gè)新的服務(wù)提供者來(lái)包含視圖composer注冊(cè),需要添加該服務(wù)提供者到配置文件config/app.phpproviders數(shù)組中。

現(xiàn)在我們已經(jīng)注冊(cè)了composer,每次profile視圖被渲染時(shí)都會(huì)執(zhí)行ProfileComposer@compose,接下來(lái)我們來(lái)定義該composer類:

<?php

namespace App\Http\ViewComposers;

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

class ProfileComposer
{
    /**
     * 用戶倉(cāng)庫(kù)實(shí)現(xiàn).
     *
     * @var UserRepository
     */
    protected $users;

    /**
     * 創(chuàng)建一個(gè)新的屬性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)用,同時(shí)Illuminate\Contracts\View\View被注入,可使用其with方法來(lái)綁定數(shù)據(jù)到視圖。

注意:所有視圖composers都通過(guò)服務(wù)容器被解析,所以你可以在composer的構(gòu)造函數(shù)中聲明任何你需要的依賴。

添加Composer到多個(gè)視圖

你可以傳遞視圖數(shù)組作為composer方法的第一個(gè)參數(shù)來(lái)一次性將視圖composer添加到多個(gè)視圖:

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

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

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

2.1 視圖創(chuàng)建器

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

view()->creator('profile', 'App\Http\ViewCreators\ProfileCreator');

擴(kuò)展閱讀:實(shí)例教程 ——?在視圖間共享數(shù)據(jù)及視圖Composer

以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)