鍍金池/ 教程/ PHP/ 視圖 (View)
Laravel Cashier
Eloquent ORM
HTTP 響應(yīng)
發(fā)行說(shuō)明
擴(kuò)展包開(kāi)發(fā)
HTTP 控制器
事件
擴(kuò)展框架
Contracts
開(kāi)發(fā)
配置
表單驗(yàn)證
錯(cuò)誤與日志
Hashing
貢獻(xiàn)指南
郵件
Session
遷移與數(shù)據(jù)填充
查詢構(gòu)造器
Redis
升級(jí)向?qū)?/span>
概覽
緩存
服務(wù)提供者
Envoy 任務(wù)執(zhí)行器
隊(duì)列
單元測(cè)試
服務(wù)容器
文件系統(tǒng) / 云存儲(chǔ)
認(rèn)證
請(qǐng)求的生命周期
加密
模板
視圖 (View)
Laravel Homestead
Laravel 安裝指南
介紹
Command Bus
分頁(yè)
輔助方法
應(yīng)用程序結(jié)構(gòu)
HTTP 路由
HTTP 請(qǐng)求
基本用法
本地化
HTTP 中間件
結(jié)構(gòu)生成器
Facades
Laravel Elixir

視圖 (View)

基本用法

視圖里面包含了你應(yīng)用程序所提供的 HTML 代碼,并且提供一個(gè)簡(jiǎn)單的方式來(lái)分離控制器和網(wǎng)頁(yè)呈現(xiàn)上的邏輯。視圖被保存在 resources/views 文件夾內(nèi)。

一個(gè)簡(jiǎn)單的視圖看起來(lái)可能像這樣:

    <!-- 視圖被保存在 resources/views/greeting.php -->

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

這個(gè)視圖可以使用以下的代碼傳遞到用戶的瀏覽器:

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

如你所見(jiàn),view 輔助方法的第一個(gè)參數(shù)會(huì)對(duì)應(yīng)到 resources/views 文件夾內(nèi)視圖文件的名稱;傳遞到 view 輔助方法的第二個(gè)參數(shù)是一個(gè)能夠在視圖內(nèi)取用的數(shù)據(jù)數(shù)組。

當(dāng)然,視圖文件也可以被存放在 resources/views 的子文件夾內(nèi)。舉例來(lái)說(shuō),如果你的視圖文件保存在 resources/views/admin/profile.php,你可以用以下的代碼來(lái)返回:

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

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

// 使用傳統(tǒng)的方法
$view = view('greeting')->with('name', 'Victoria');

// 使用魔術(shù)方法
$view = view('greeting')->withName('Victoria');

在上面的例子代碼中,視圖將可以使用 $name 來(lái)取得數(shù)據(jù),其值為 Victoria。

如果你想的話,還有一種方式就是直接在 view 輔助方法的第二個(gè)參數(shù)直接傳遞一個(gè)數(shù)組:

$view = view('greetings', $data);

把數(shù)據(jù)共享給所有視圖

有時(shí)候你可能需要共享一些數(shù)據(jù)給你的所有視圖,你有很多個(gè)選擇:view 輔助方法;Illuminate\Contracts\View\Factory合約 (contract);在 視圖組件 (view composer) 內(nèi)使用通配符。

這里有個(gè) view 輔助方法的例子:

view()->share('data', [1, 2, 3]);

你也可以使用 view 的 Facade:

View::share('data', [1, 2, 3]);

通常你應(yīng)該在服務(wù)提供者的 boot 方法內(nèi)使用 share 方法。你可以選擇加在 AppServiceProvider 或者是新建一個(gè)單獨(dú)的服務(wù)提供者來(lái)容納這些代碼。

備注: 當(dāng) view 輔助方法沒(méi)有帶入任何參數(shù)調(diào)用時(shí),它將會(huì)返回一個(gè)的 Illuminate\Contracts\View\Factory 合約 (contract) 的實(shí)現(xiàn) (implementation)。

確認(rèn)視圖是否存在

如果你需要確認(rèn)視圖是否存在,使用 exists 方法:

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

從一個(gè)文件路徑產(chǎn)生視圖

你可以從一個(gè)完整的文件路徑來(lái)產(chǎn)生一個(gè)視圖:

return view()->file($pathToFile, $data);

視圖組件

視圖組件就是在視圖被渲染前,會(huì)調(diào)用的閉包或類方法。如果你想在每次渲染某些視圖時(shí)綁定數(shù)據(jù),視圖組件可以把這樣的程序邏輯組織在同一個(gè)地方。

定義一個(gè)視圖組件

讓我們?cè)?服務(wù)提供者 內(nèi)組織我們的視圖組件。底下例子將使用 View Facade 來(lái)取得底層 Illuminate\Contracts\View\Factory合約的實(shí)現(xiàn):

<?php namespace App\Providers;

use View;
use Illuminate\Support\ServiceProvider;

class ComposerServiceProvider extends ServiceProvider {

    /**
     * Register bindings in the container.
     *
     * @return void
     */
    public function boot()
    {
        // 使用類來(lái)指定視圖組件
        View::composer('profile', 'App\Http\ViewComposers\ProfileComposer');

        // 使用閉包來(lái)指定視圖組件
        View::composer('dashboard', function()
        {

        });
    }

    /**
     * Register
     *
     * @return void
     */
    public function register()
    {
        //
    }

}

備注: Laravel 沒(méi)有默認(rèn)的文件夾來(lái)放置類形式的視圖組件。你可以自由的把它們放在你想要的地方。舉例來(lái)說(shuō),你可以放在 App\Http\ViewComposers 文件夾內(nèi)。

記得要把這個(gè)服務(wù)提供者添加到 config/app.php 配置文件的 providers 數(shù)組中。

現(xiàn)在我們已經(jīng)注冊(cè)了視圖組件,并且在每次 profile 視圖渲染的時(shí)候,ProfileComposer@compose 都將會(huì)被執(zhí)行。接下來(lái)我們來(lái)看看這個(gè)類要如何定義:

<?php namespace App\Http\ViewComposers;

use Illuminate\Contracts\View\View;
use Illuminate\Users\Repository as 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)
    {
        // service container 會(huì)自動(dòng)解析所需的參數(shù)
        $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 方法就會(huì)被調(diào)用,并且傳入一個(gè) Illuminate\Contracts\View\View 實(shí)例。你可以使用 with 方法來(lái)把數(shù)據(jù)綁定到 view。

備注: 所有的視圖組件會(huì)被 服務(wù)容器 (service container) 解析,所以你需要在視圖組件的構(gòu)造器類型限制你所需的任何依賴參數(shù)。

在視圖組件內(nèi)使用通配符

Viewcomposer 方法可以接受 * 作為通配符,所以你可以對(duì)所有視圖附加 composer 如下:

View::composer('*', function()
{
    //
});

同時(shí)對(duì)多個(gè)視圖附加視圖組件

你也可以同時(shí)針對(duì)多個(gè)視圖附加同一個(gè)視圖組件:

View::composer(['profile', 'dashboard'], 'App\Http\ViewComposers\MyViewComposer');

定義多個(gè)視圖組件

你可以使用 composers 方法來(lái)同時(shí)定義一群視圖組件:

View::composers([
    'App\Http\ViewComposers\AdminComposer' => ['admin.index', 'admin.profile'],
    'App\Http\ViewComposers\UserComposer' => 'user',
    'App\Http\ViewComposers\ProductComposer' => 'product'
]);

視圖創(chuàng)建者

視圖 創(chuàng)建者 幾乎和視圖組件運(yùn)作方式一樣;只是視圖創(chuàng)建者會(huì)在視圖初始化后就立刻執(zhí)行。要注冊(cè)一個(gè)創(chuàng)建者,只要使用 creator 方法:

View::creator('profile', 'App\Http\ViewCreators\ProfileCreator');
上一篇:輔助方法下一篇:隊(duì)列