2013-10-09 28 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"); 
     } 
     ... 
    } 
} 
相关问题