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

視圖 (View)

基本用法

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

一個簡單的視圖看起來可能像這樣:

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

這里有個 view 輔助方法的例子:

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

你也可以使用 view 的 Facade:

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

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

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

確認視圖是否存在

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

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

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

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

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

視圖組件

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

定義一個視圖組件

讓我們在 服務提供者 內(nèi)組織我們的視圖組件。底下例子將使用 View Facade 來取得底層 Illuminate\Contracts\View\Factory合約的實現(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()
    {
        // 使用類來指定視圖組件
        View::composer('profile', 'App\Http\ViewComposers\ProfileComposer');

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

        });
    }

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

}

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

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

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

<?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 會自動解析所需的參數(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 方法就會被調(diào)用,并且傳入一個 Illuminate\Contracts\View\View 實例。你可以使用 with 方法來把數(shù)據(jù)綁定到 view。

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

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

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

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

同時對多個視圖附加視圖組件

你也可以同時針對多個視圖附加同一個視圖組件:

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

定義多個視圖組件

你可以使用 composers 方法來同時定義一群視圖組件:

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

視圖創(chuàng)建者

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

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