了解Laravel View Composers:我的视图作曲家属于哪里?

时间:2018-02-18 00:55:40

标签: php laravel

我正在阅读Laravel文档以获得更深入的理解,这将是我第二次遇到一些混乱。

不久前,我正在研究一个Laracasts视频,我们在AppServicesProvider寄存器方法中实现了一个View作曲家。

看起来像这样:

public function register()
{
    view()->composer('layouts.sidebar', function ($view) {
        $archives = \App\Post::archives();
        $tags = \App\Tag::has('posts')->pluck('name');
        $view->with(compact('archives', 'tags'));
    });
}

这样做,是否使档案和标签可用于我们的侧边栏视图,几乎每个页面都可以使用。 (Laracast视频涉及从头开始构建博客)

到目前为止一切顺利。

今天,在我阅读视图作曲家的文档时,我遇到了this example

/**
 * Register bindings in the container.
 *
 * @return void
 */
public function boot()
{
    // Using class based composers...
    View::composer(
        'profile', 'App\Http\ViewComposers\ProfileComposer'
    );

    // Using Closure based composers...
    View::composer('dashboard', function ($view) {
        //
    });
}

现在,我认为我理解创建自己的ComposerServiceProvider和基于类的作曲家与基于闭包。令我困惑的是,这是在boot()方法与register()方法中完成的。

我完全有可能在错误的地方写这个。如果我考虑一下,它在register()方法中几乎没有意义,因为寄存器只应用于注册服务。在调用所有寄存器方法后调用引导。如果有人能为我清除这一点,我将不胜感激!

  

视图作曲家是否属于register()方法或boot()方法?和   如果它属于register()方法,那只是巧合   它仍适用于我?

2 个答案:

答案 0 :(得分:4)

引用用户在this问题中给出的答案:

  

启动和注册方法之间的区别?

     

我实际上昨晚从泰勒的书中了解到了这一点。   以下是关于它的摘录:

     

“所有提供商注册后,都会被”启动“。这个   将在每个提供程序上触发引导方法。一个常见的错误   使用服务提供商正在尝试使用提供的服务   注册方法中的另一个提供者。因为,在寄存器内   方法,我们无法保证所有其他提供商都已加载了   您尝试使用的服务可能尚未提供。所以,服务   使用其他服务的提供程序代码应始终存在于引导中   方法。注册方法只应该用于,你猜对了,   向容器注册服务。在启动方法中,你   可以做任何你喜欢的事情:注册事件监听器,包括路由   文件,注册过滤器或任何你能想象到的东西。“

     

因此寄存器1仅用于绑定。引导一个实际上   触发事情发生。

答案 1 :(得分:2)

它们应该放在引导方法中。注册方法不保证在您需要时可以解决依赖关系。使用启动方法,您可以获得保证。正如您所提到的,理想情况下,您应该为视图编辑器创建一个单独的服务提供程序。