中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Laravel如何設置視圖合成器

發布時間:2021-01-25 12:43:07 來源:億速云 閱讀:157 作者:小新 欄目:編程語言

這篇文章主要介紹Laravel如何設置視圖合成器,文中介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們一定要看完!

Laravel 提供的令人興奮的功能之一就是視圖擴展這個功能,在我看來,一個非常強大的視圖擴展,允許開發將變量從全局精準的傳遞到模板。

怎樣使用視圖(View)擴展?

首先你必須要知道兩種不同類型的視圖擴展,即基于類和閉包。

<?php 
View::composer('profile', function ($view) {
    $view->with('user', ['...']);
});
// 或者
View::composer('profile', 'App\Http\ViewComposers\ProfileComposer');

差別非常的明顯,閉包容易使用,且不需要投入太多精力去設置,但他們會導致該服務提供者(Service Provider)日漸臃腫。

另一方面,基于類的 視圖擴展 引導你直接將設計原則分離出來,另一個好處是,您可以測試隔離的這段代碼,其他開發人員可以更輕松的維護現有代碼。

在計算機科學中,關注點分離(SoC)是將計算機程序分解成盡可能少地在功能上重疊的不同特征的過程,關注點是程序中的任何有意思的地方或者焦點。通常,關注點與特征或行為是同義詞,傳統上通過模塊化和封裝在信息隱藏的幫助下實現 SoC 的進步。

理解 View::composer 方法的參數

在這個例子中,你可以看到 View::composer 方法有兩個參數。

<?php 
View::composer('profile', function ($view) {
    $view->with('user', ['...']);
});
// 或者
View::composer('profile', 'App\Http\ViewComposers\ProfileComposer');

第一個參數是你想要監聽的視圖的名字,可以是一個字符串或者數組。意思是,如果這個模板視圖被渲染了,你的 視圖管理器 就會被觸發,并且傳遞變量到視圖。

你也可以使用通配符而不是手動選擇所有的模板,你可以方便地使用星號(*),將數據附加到每一個視圖,甚至是有很多個子目錄的復雜模板。

使用場景通常是需要在每個視圖中展示的側邊欄或者導航元素。

<?php
// 為一個視圖添加合成器: ~/resources/views/profile
View::composer('profile', ...);
// 為多個視圖添加: ~/resources/views/profile, ~/resources/views/profile_edit and ~/resources/views/profile_settings
View::composer(['profile', 'profile_edit', 'profile_settings'], ...);
// 目錄通配符: all files in ~/resources/views/pages/*
View::composer(['*pages.*'], ...);

第二個參數可以是閉包函數也可以是 view composer 的類名。

兩種方法都接收一個 $view 參數,通過這個參數很簡單地就能用 method ->with() 來往視圖中增加變量。

<?php 
View::composer('*', function ($view) {
    $view->with('breadcrumb', ['item 1', 'item ']);
});
// 或者 
View::composer('*', 'App\Http\ViewComposers\NavigationComposer');
// compose 方法也有 $view 參數 
namespace App\Http\View\Composers;
use Illuminate\View\View;
class NavigationComposer
{
    /**
     * @param  View  $view
     * @return void
     */
    public function compose(View $view)
    {
        $view->with('navigation', [
            'items1', 'items2', 'item3'
        ]);
    }
}

設置視圖合成器

你可能知道 Laravel 會使用提供者做很多事情,你就能猜到接下來的是什么?是的,我們必須注冊一個服務提供者,在提供者內,使用我們剛剛學習的 視圖合成器。

ViewComposerServiceProvider.php

<?php
namespace App\Providers;
use Illuminate\Support\Facades\View;
use Illuminate\Support\ServiceProvider;
class ViewComposerServiceProvider extends ServiceProvider
{
    public function boot()
    {
        View::composer(
            'pages/*', 'App\Http\View\Composers\NavigationComposer'
        );
    }
    /**
     * 注冊服務提供者
     *
     * @return void
     */
    public function register()
    {
        // TODO: 實現 register() 方法。
    }
}

現在只剩下一件事情就是在~/config/app.php 中注冊一個新的服務提供者。

<?php
return [
  'providers' => [
        // ....
        /*
         * 應用的服務提供者...
         */
        App\Providers\AppServiceProvider::class,
        App\Providers\AuthServiceProvider::class,
        App\Providers\EventServiceProvider::class,
        App\Providers\RouteServiceProvider::class,
        App\Providers\ViewComposerServiceProvider::class,
        // ....
    ],
];

就是這樣,現在我們可以測試 視圖合成器

測試視圖編輯器

假設我們有一個名為 /detail  的頁面,這個頁面需要一個數組形式的導航數據 (如下)。

<?php
namespace App\Http\View\Composers;
use Illuminate\View\View;
class NavigationComposer
{
    /**
     * @param  View  $view
     * @return void
     */
    public function compose(View $view)
    {
        $view->with('navigation', [
            'items1', 'items2', 'item3'
        ]);
    }
}

我們可以通過 ->assertViewHas().  方法來測試我們的 試圖編輯器 ,這個方法可以檢測 視圖編輯器 是否在監聽右側視圖并把 $navigation 變量傳遞給它。

<?php
class ViewComposerTest extends TestCase
{
    /**
     * @return void
     */
    public function testDetailHasNavigationItems()
    {
        $this->get('/detail')->assertViewHas('navigation');
    }
}

雖然這個測試看起來很簡單,但至少我們可以知道 視圖編輯器 是否生效。

以上是“Laravel如何設置視圖合成器”這篇文章的所有內容,感謝各位的閱讀!希望分享的內容對大家有幫助,更多相關知識,歡迎關注億速云行業資訊頻道!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

沁水县| 班玛县| 威远县| 盘锦市| 钟祥市| 青州市| 同心县| 兴山县| 天祝| 历史| 商洛市| 昆山市| 安岳县| 容城县| 新邵县| 子洲县| 津南区| 淮南市| 乐昌市| 巴东县| 沾化县| 黄平县| 甘洛县| 壤塘县| 平南县| 兴化市| 卓资县| 晋州市| 台江县| 新郑市| 额尔古纳市| 宁陕县| 陇川县| 芜湖县| 台中市| 邵东县| 泽库县| 枣庄市| 武城县| 沧州市| 肥西县|