視圖 (View)

2018-12-17 10:42 更新

基本用法

視圖里面包含了你應(yīng)用程序所提供的 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ù)會對應(yīng)到 resources/views 文件夾內(nèi)視圖文件的名稱;傳遞到 view 輔助方法的第二個參數(shù)是一個能夠在視圖內(nèi)取用的數(shù)據(jù)數(shù)組。

當(dāng)然,視圖文件也可以被存放在 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ù)傳參, $data 必須是 鍵/值 對應(yīng)的數(shù)組數(shù)據(jù), 這樣在視圖里面, 你可以使用對應(yīng)的鍵來獲取值, 如: {{ $key }} 會取得 $data['key'] 對應(yīng)的數(shù)據(jù).

把數(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]);

           

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

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

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

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

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

           

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

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

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

           

           

視圖組件

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

定義一個視圖組件

讓我們在 服務(wù)提供者 內(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($view)
        {

        });
    }

    /**
     * Register the service provider.
     *
     * @return void
     */
    public function register()
    {
        //    }}

           

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

記得要把這個服務(wù)提供者添加到 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

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

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

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

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

           

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

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

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');


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

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號