作曲家:
视图组合器是在呈现视图时调用的回调或类方法。如果每次在整个应用程序中呈现视图时都希望绑定到给定视图的数据,则视图编辑器可以将该代码组织到单个位置。因此,视图编辑器的功能可能类似于“视图模型”或“演示者”。
View::composer('profile', function($view)
{
$view->with('count', User::count());
});
并且
创作者:
视图创作者的工作方式几乎与视图作曲家一样;但是,在实例化视图时会立即触发它们。要注册视图创建者,只需使用创建者方法
View::creator('profile', function($view)
{
$view->with('count', User::count());
});
所以问题是:有什么区别?
答案 0 :(得分:56)
使用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 :(得分:16)
我花了一段时间来解决这个问题,我不得不深入研究源代码来解决这个问题。不同之处在于您希望命令运行的Laravel应用程序循环中的哪一点。
Laravel循环中有许多涉及观点的要点。
您可以使用View::make()
制作视图。这是在实例化视图时 - 在View::make()
命令期间,在返回函数之前调用任何View::creators()
。
通常你只需要运行return View::make()
- 这意味着视图被“创建”,然后返回到Laravel核心,然后它被“组合”到屏幕上。这是在调用View::composer()
时(即在视图返回后)。
我不确定你为什么要使用其中一种,但这解释了两者之间的区别。
答案 2 :(得分:4)
另一个区别是ViewCreator中抛出的异常会冒泡回到Controller。这对授权很方便。在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");
}
...
}
}