Laravel中View Composer和Creator的区别是什么?

31

根据Laravel 4文档

Composer是什么?

视图Composer是回调或类方法,当渲染视图时会调用它们。如果您有要绑定到给定视图的数据,并且想在应用程序中每次呈现该视图时都自动执行此操作,那么视图Composer可以将代码组织到一个单独的位置。因此,视图Composer可以像“视图模型”或“Presenter”一样发挥作用。

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

并且

创建者是

查看创建者的工作方式几乎与查看组合器相同;但是,它们在视图实例化时立即启动。要注册视图创建者,只需使用 creator 方法即可。

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

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

3个回答

73

当您使用 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
这是一个好答案,因为它提供了一个具体的例子。谢谢! - Seb Barre
这个答案是有道理的。 - Hafiz
2
应该包含在官方文档中。 - Munim Munna

16

我花了一些时间才解决了这个问题,需要查看源代码才能理解。不同之处在于你想要在Laravel应用程序的哪个周期内运行该命令。

Laravel生命周期中涉及视图的几个时刻。

你可以使用View::make()创建视图。这是在实例化视图时发生的 - 在View::make()命令期间调用任何View::creators(),然后返回函数。

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

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


2
如果你好奇为什么 Laravel 框架增加了创建者(原本只有作曲家),请参见 laravel/framework Issue #1822 - Bailey Parker

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");
        }
        ...
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接