首頁  >  文章  >  php框架  >  Laravel 視圖合成器

Laravel 視圖合成器

Guanhui
Guanhui轉載
2020-06-12 18:01:412874瀏覽

Laravel 視圖合成器

我最早使用 Laravel 工作的版本是 4.2 ,現在我仍然是它忠實的粉絲。當然,多年來我學到了很多,也遇到了很多問題、困難,但我仍然期待 Laravel 接下來會發生怎樣的變化。

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

怎麼使用視圖(View)擴充?

首先你必須要知道兩種不同類型的視圖擴展,也就是基於類別和閉包。

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

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

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

在電腦科學中,關注點分離(SoC)是將電腦程式分解成盡可能少地在功能上重疊的不同特徵的過程,關注點是程式中的任何有意思的地方或焦點。通常,關注點與特徵或行為是同義詞,傳統上透過模組化和封裝在資訊隱藏的幫助下實現 SoC 的進步。

瞭解 View::composer 方法的參數

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

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

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

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

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

<?php
// 为一个视图添加合成器: ~/resources/views/profile
View::composer(&#39;profile&#39;, ...);
// 为多个视图添加: ~/resources/views/profile, ~/resources/views/profile_edit and ~/resources/views/profile_settings
View::composer([&#39;profile&#39;, &#39;profile_edit&#39;, &#39;profile_settings&#39;], ...);
// 目录通配符: all files in ~/resources/views/pages/*
View::composer([&#39;*pages.*&#39;], ...);

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

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

<?php 
View::composer(&#39;*&#39;, function ($view) {
    $view->with(&#39;breadcrumb&#39;, [&#39;item 1&#39;, &#39;item &#39;]);
});
// 或者 
View::composer(&#39;*&#39;, &#39;App\Http\ViewComposers\NavigationComposer&#39;);
// 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(&#39;navigation&#39;, [
            &#39;items1&#39;, &#39;items2&#39;, &#39;item3&#39;
        ]);
    }
}

設定視圖合成器

你可能知道 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(
            &#39;pages/*&#39;, &#39;App\Http\View\Composers\NavigationComposer&#39;
        );
    }
    /**
     * 注册服务提供者
     *
     * @return void
     */
    public function register()
    {
        // TODO: 实现 register() 方法。
    }
}

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

<?php
return [
  &#39;providers&#39; => [
        // ....
        /*
         * 应用的服务提供者...
         */
        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(&#39;navigation&#39;, [
            &#39;items1&#39;, &#39;items2&#39;, &#39;item3&#39;
        ]);
    }
}

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

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

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

結論

基於閉包或基於類別的 視圖管理器 將簡化程式碼,使得開發者更容易使用它。它也是 Laravel 的一部分,為什麼我們不使用這麼強大的服務。

我很期待 Laravel 的新特性,我希望可以向你展示一些新的東西。

推薦教學:《Laravel教學

以上是Laravel 視圖合成器的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:learnku.com。如有侵權,請聯絡admin@php.cn刪除