欧美亚洲中文,在线国自产视频,欧洲一区在线观看视频,亚洲综合中文字幕在线观看

      1. <dfn id="rfwes"></dfn>
          <object id="rfwes"></object>
        1. 站長資訊網
          最全最豐富的資訊網站

          Laravel 視圖合成器

          Laravel 視圖合成器

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

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

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

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

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

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

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

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

          理解 View::composer 方法的參數

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

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

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

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

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

          <?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('*', 'AppHttpViewComposersNavigationComposer'); // compose 方法也有 $view 參數  namespace AppHttpViewComposers; use IlluminateViewView; class NavigationComposer {     /**      * @param  View  $view      * @return void      */     public function compose(View $view)     {         $view->with('navigation', [             'items1', 'items2', 'item3'         ]);     } }

          設置視圖合成器

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

          ViewComposerServiceProvider.php

          <?php namespace AppProviders; use IlluminateSupportFacadesView; use IlluminateSupportServiceProvider; class ViewComposerServiceProvider extends ServiceProvider {     public function boot()     {         View::composer(             'pages/*', 'AppHttpViewComposersNavigationComposer'         );     }     /**      * 注冊服務提供者      *      * @return void      */     public function register()     {         // TODO: 實現 register() 方法。     } }

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

          <?php return [   'providers' => [         // ....         /*          * 應用的服務提供者...          */         AppProvidersAppServiceProvider::class,         AppProvidersAuthServiceProvider::class,         AppProvidersEventServiceProvider::class,         AppProvidersRouteServiceProvider::class,         AppProvidersViewComposerServiceProvider::class,         // ....     ], ];

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

          測試視圖編輯器

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

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

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

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

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

          結論

          基于閉包或者基于類的 視圖管理器 將簡化代碼,使得開發(fā)者更容易使用它。它也是 Laravel 的一部分,為什么我們不使用這么強大的服務呢。

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

          推薦教程:《Laravel教程》

          贊(0)
          分享到: 更多 (0)
          網站地圖   滬ICP備18035694號-2    滬公網安備31011702889846號