30

根据Laravel 4 文档。

作曲家是

视图合成器是在渲染视图时调用的回调或类方法。如果每次在整个应用程序中呈现该视图时,您都希望将数据绑定到给定视图,则视图编辑器可以将该代码组织到一个位置。因此,视图编辑器的功能可能类似于“视图模型”或“演示者”。

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

创建者是

视图创建者的工作几乎与视图作曲家一样。但是,当视图被实例化时,它们会立即被触发。要注册视图创建者,只需使用 creator 方法

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

所以问题是:有什么区别?

4

3 回答 3

68

当您使用时,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
于 2014-05-25T16:29:54.757 回答
17

我花了一段时间才解决这个问题,我不得不挖掘源代码来解决它。不同之处在于您希望命令在 Laravel 应用程序循环的哪个时间点运行。

Laravel 循环中有很多点涉及视图。

您可以使用View::make(). 这是在实例化视图时 - 在View::make()命令任何View::creators()被调用期间,在函数返回之前。

通常你只是运行return View::make()——这意味着视图是“创建的”,然后返回到 Laravel 核心,然后它被“组合”到屏幕上。这是View::composer()调用的时候(即在视图返回之后)。

我不确定您为什么要使用其中一个,但这解释了两者之间的区别。

于 2013-10-09T12:17:25.633 回答
4

另一个区别是 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");
        }
        ...
    }
}
于 2015-07-29T16:27:10.160 回答