【问题标题】:Laravel: Difference between View::share() and View::composer()Laravel:View::share() 和 View::composer() 之间的区别
【发布时间】:2013-08-21 08:52:26
【问题描述】:

关于问题Passing default variables to view,要在所有视图之间传递可用的变量,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)。考虑到这一点,我猜一堂课要好得多?虽然,我不太清楚为什么在这一点上。 :)

【问题讨论】:

    标签: php view laravel


    【解决方案1】:

    从技术上讲,它们根本不一样。 View::share 只是设置一个变量,而View::composer 是一个回调函数。

    让我更详细地解释一下:

    View::share 非常直接,它设置了一个可在任何视图中使用的变量,将其视为全局变量。

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

    View::composer / View::creator 都可以用作well documented 的类。

    虽然这些使您能够将其他数据传递给视图,但它们也使您能够做很多其他事情,例如它们可以:

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

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

    【讨论】:

    • 我明白了。因此,为简单起见,如果您只想输出一个“全局”变量,那么最好使用View::share()。对于其他/除此之外的任何内容,请使用View::composer()
    • 为了简单起见,但是如果您发现自己一遍又一遍地定义它,可能会将其抽象为 View::composer
    • 还可以查看这个答案stackoverflow.com/a/23857517/682754。两者都真正帮助我理解了差异。
    【解决方案2】:
    View::composer('*', callback());
    

    表示将为所有视图调用回调 (*)。

    View::share
    

    表示一个变量将与所有输出视图共享。

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

    第二个在控制器构造器中,因此它将应用于由该控制器触发的所有视图。

    最后一件事:在重写构造函数时,始终使用以下代码调用父构造函数是一种很好的做法:

    parent::_construct();
    

    【讨论】:

    • 我明白了。所以即使在 routes.php 和任何其他文件中也可以访问Views::composer 变量?出于好奇,是否可以这样做以使特定变量可用于除$this->varname 之外的所有控制器
    • 如果 View::composer('*', callback()) 是一个有效的选项,它应该在文档中。
    猜你喜欢
    • 2015-08-22
    • 2013-10-16
    • 2014-07-22
    • 2013-04-18
    • 2015-12-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多