2013-10-09 29 views
22

根據Laravel 4 documentation.Laravel 4中View Composer和Creator的區別?

Composer是

查看作曲家是當一個視圖被呈現被稱爲回調或類方法。如果您每次在整個應用程序中呈現該視圖時都要綁定到給定視圖的數據,則視圖編輯器可以將該代碼組織到單個位置。因此,查看作曲家可以像「查看模型」或「演示者」那樣起作用。

View::composer('profile', function($view) 
{ 
    $view->with('count', User::count()); 
}); 

而且

Creator是

查看創作者的工作幾乎完全一樣觀點的作曲家;然而,當視圖被實例化時,它們立即被觸發。要註冊視圖創建,使用簡單的創造者方法

View::creator('profile', function($view) 
{ 
    $view->with('count', User::count()); 
}); 

所以,問題是:的區別是什麼?

回答

46

當您使用View::creator時,您有機會覆蓋控制器中視圖的變量。像這樣:

View::creator('layout', function($view) { 
    $view->with('foo', 'bar'); 
}); 

// in controller 
return View::make('layout')->with('foo', 'not bar at all'); 

// it's defined as 'not bar at all' in the view 

-

View::composer('hello', function($view) { 
    $view->with('foo', 'bar'); 
}); 

// in controller 
return View::make('hello')->with('foo', 'not bar at all'); 

// it's defined as 'bar' in the view 
+1

這是一個很好的答案,因爲它提供了一個具體的例子。謝謝! –

+1

很高興知道它的重要性。謝謝+1 – isimmons

+0

這個答案很有意義 – Hafiz

16

我花了一段時間來解決這個問題,我不得不挖掘源代碼來解決這個問題。不同之處在於您希望命令運行的Laravel應用程序週期中的哪一點。

Laravel循環中有許多關於視圖的要點。

您可以使用View::make()進行查看。這是實例化視圖時 - 在View::make()命令期間調用任何View::creators(),在返回函數之前。

通常情況下,您只需運行return View::make() - 這意味着該視圖是「創建的」,然後返回到Laravel核心,然後「合成」屏幕。這是調用View::composer()時(即視圖返回後)。

我不確定你爲什麼要使用其中一個,但這解釋了兩者之間的差異。

+2

如果你是好奇,爲什麼加創(原來有隻作曲家),參見[laravel /框架問題#1822](https://github.com/laravel/framework/issues/1822) –

+0

@PhpMyCoder你太棒了!謝謝! –

3

另一個區別是,異常的ViewCreator內拋出將氣泡備份到控制器。這對於授權很方便。在ViewCreator中,您可以獲取權限數據,然後如果用戶未被授權訪問該頁面,請拋出異常並讓控制器處理它。例如:

class MyController { 
    public function MyAction { 
     try { 
      return view('my_view'); 
     } catch (\Exception $e) { 
      echo "<h1>Exception</h1>"; 
      echo $e->getMessage(); 
     } 
    } 
} 

class MyViewCreator { 
    public function create(View $view) { 
     $loggedInUser = User::with('permissions')->find(Auth::user()->id); 
     if (! $loggedInUser->hasPermission('MY_PERMISSION')) { 
      throw new \Exception("You are not authorized"); 
     } 
     ... 
    } 
} 
相關問題