視圖


檢視合成器

################## ########

建立視圖

{tip} 如果你想找到更多關於如何寫 Blade 範本的資訊?從檢視完整的 Blade 文件 入手。

檢視包含應用程式的 HTML,並且將控制器 / 應用程式邏輯與示範邏輯分開。視圖檔案存放於 resources/views 目錄下。一個簡單的視圖如下:

<!-- 此视图文件位置 resources/views/greeting.blade.php -->
<html>
  <body>
    <h1>Hello, {{ $name }}</h1>    
  </body>
</html>

該視圖檔案位於resources/views/greeting.blade.php,可以使用全域輔助函數view 來傳回:

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

如您所見,傳遞給view 幫助器的第一個參數對應於resources/views 目錄中視圖檔案的名稱。第二個參數是應該可供視圖使用的資料數組。在這種情況下,我們傳遞 name 變量,該變數使用 Blade syntax 顯示在視圖中。

當然,檢視檔案也可以嵌套在 resources/views 目錄的子目錄中。 “點”符號可以用來引用巢狀視圖。例如,如果你的視圖儲存在resources/views/admin/profile.blade.php,則可以這樣引用它:

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

判斷視圖檔案是否存在

如果需要判斷檢視檔案是否存在,可以使用View facade. 如果檢視檔案存在,exists 方法會傳回 true

use Illuminate\Support\Facades\View;if (View::exists('emails.customer')) { 
   //
}

建立第一個可用視圖

使用first 方法,你可以建立存在於給定陣列視圖中的第一個視圖。如果你的應用程式或開發的第三方套件允許定製或覆寫視圖,這非常有用:

return view()->first(['custom.admin', 'admin'], $data);

當然,你也可以透過View facade 呼叫這個方法:

use Illuminate\Support\Facades\View;return View::first(['custom.admin', 'admin'], $data);

向視圖傳遞參數

#正如您在前面的範例中所看到的,您可以將一組資料傳遞給視圖:

return view('greetings', ['name' => 'Victoria']);

以這種方式傳遞訊息時,資料應該是具有鍵/ 值對的陣列。在視圖中,您可以使用對應的鍵存取每個值,例如 <?php echo $key; ?>。作為將完整的資料數組傳遞給view 輔助函數的替代方法,您可以使用with 方法將各個資料片段新增至視圖:

return view('greeting')->with('name', 'Victoria');

與所有視圖共享資料

如果需要共享一段資料給應用程式的所有視圖,你可以在服務提供者的boot 方法中呼叫視圖Facade 的share 方法。例如,可以將它們新增至 AppServiceProvider 或為它們產生一個單獨的服務提供者:

<?php
  namespace App\Providers;
  use Illuminate\Support\Facades\View;
  class AppServiceProvider extends ServiceProvider{   
     /**
     * Bootstrap any application services.
     *
     * @return void
     */   
     public function boot()   
      {      
        View::share('key', 'value');   
       }   
     /**
     * Register the service provider.
     *
     * @return void
     */    
     public function register()  
       {      
         // 
        }
     }

視圖合成器

視圖合成器是在呈現視圖時呼叫的回呼或類別方法。如果每次呈現視圖時都希望將資料綁定到視圖,則視圖合成器可以幫助您將該邏輯組織到一個位置。

在下面這個範例中,我們會在一個 服務提供者 中註冊視圖合成器。使用 View facade 來存取底層的 Illuminate\Contracts\View\Factory 契約實作。預設情況下,Laravel 沒有存放視圖合成器的目錄,你需要根據需求來重新建立目錄,例如: app/Http/View/Composers :

<?php
   namespace App\Providers;
   use Illuminate\Support\Facades\View;
   use Illuminate\Support\ServiceProvider;
   class ViewServiceProvider extends ServiceProvider{    
      /**
     * Register bindings in the container.
     *
     * @return void
     */  
    public function boot()  
      {      
        // Using class based composers...        
        View::composer(        
            'profile', 'App\Http\View\Composers\ProfileComposer'     
          );      
        // Using Closure based composers...        
        View::composer('dashboard', function ($view) {      
              //  
           });    
        }   
    /**
     * Register the service provider.
     *
     * @return void
     */   
     public function register()  
       {   
            //   
        }
      }

#{note } 注意,如果你建立了新的一個服務提供者來存放你註冊視圖合成器的程式碼,那麼你需要將這個服務提供者加入到設定檔config/app.php providers 陣列中。

到此我們已經註冊了視圖合成器,每次渲染 profile 視圖時都會執行 ProfileComposer@compose 方法。那麼下面我們來定義視圖合成器的這個類別吧:

<?php
   namespace App\Http\View\Composers;
   use Illuminate\View\View;
   use App\Repositories\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)    {        
    // Dependencies automatically resolved by service container...        
    $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 方法會在視圖渲染之前被調用,並傳入一個Illuminate\View \View 實例。你可以使用 with 方法將資料綁定到視圖。

{tip} 所有的視圖合成器都會透過 服務容器 ,  來解析,所以你可以在視圖合成器的建構子中型別提示需要注入的依賴項。

將視圖合成器新增至多個視圖

透過將一組視圖作為第一個參數傳入composer 方法,將一個視圖合成器新增至多個視圖:

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

composer 方法同時也接受通配符* ,表示將一個視圖合成器新增至所有視圖:

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

視圖建構器

視圖creators 和視圖合成器非常相似。唯一不同之處在於:視圖建構器在視圖實例化之後立即執行,而視圖合成器在視圖即將渲染時執行。使用 creator 方法註冊視圖構造器:

View::creator('profile', 'App\Http\View\Creators\ProfileCreator');
本文章首發在 LearnKu.com 網站上。