Laravel:View::share()和View::composer()的区别

9

关于问题“传递默认变量到视图”,如果要传递在所有视图中可用的变量,那么使用View::composer()和其他方法有技术或功能上的区别吗?

View::composer('*', function($view) {
    $thundercats = 'Woooooohh!!';
    $view->with('thundercats', $thundercats);
})

filters.php文件中或在BaseController.php文件中使用View::share():

public function __construct {
    $thundercats = 'Woooooohh!!';
    View::share('thundercats', $thundercats);
}

我最近才了解到View::share(),虽然我已经在另一个项目中开始使用前者,但我觉得这个函数非常有趣。 编辑: 我的第一个推测是前者是一个文件(filters.php)而后者是一个类(BaseController.php)。考虑到这一点,我猜想一个类会更好一些?虽然,此时我还不太确定原因。 :)
2个回答

22

从技术上讲,它们完全不同。View::share只是设置一个变量,而View::composer则是一个回调函数。

让我更详细地解释一下:

View::share非常直接,它设置一个变量,该变量可以在任何视图中使用,就像全局变量一样。

View::composer 注册了一个事件,当视图渲染时会被调用,不要将其与 View::creator 混淆,后者在视图实例化时触发。

View::composer / View::creator 都可以作为一个类使用,其well documented

虽然这些函数让你能够向视图传递额外的数据,但它们还能做很多其他的事情,例如:

  • 帮助调试视图
  • 记录有关视图的信息
  • 用于创建自定义缓存(可能不是一个好主意,但是可以实现)

这只是使用View::composerView::creator可能实现的一些示例。


我明白了。所以为了简单起见,如果你只想输出一个“全局”变量,那么最好使用View::share()。对于其他/更多的内容,请使用View::composer() - enchance
1
为了简单起见,如果你发现自己一遍又一遍地定义它,那么最好将其抽象成一个 View::composer - tplaner
还要查看这个答案https://dev59.com/q2Ik5IYBdhLWcg3wdd0l#23857517。两者都帮助我理解了差异。 - Carlton

2
View::composer('*', callback());

意味着回调函数将被用于所有视图(*)。
View::share

这意味着变量将与所有输出的视图共享。

因为第一个是在filters.php中,它将适用于所有路由。

第二个是在控制器构造函数中,因此它将适用于此控制器触发的所有视图。

最后一件事:当覆盖构造函数时,最好始终使用以下代码调用父构造函数:

parent::_construct();

我明白了。所以Views::composer变量可以在_routes.php_和任何其他文件中访问?出于好奇,除了$this->varname之外,是否可以将其用于使特定变量对所有控制器可用? - enchance
如果 View::composer('*', callback()) 是一个有效的选项,它应该在文档中被提及。 - Christopher Raymond

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