我正在阅读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()
方法,那只是巧合 它仍适用于我?
答案 0 :(得分:4)
引用用户在this问题中给出的答案:
启动和注册方法之间的区别?
我实际上昨晚从泰勒的书中了解到了这一点。 以下是关于它的摘录:
“所有提供商注册后,都会被”启动“。这个 将在每个提供程序上触发引导方法。一个常见的错误 使用服务提供商正在尝试使用提供的服务 注册方法中的另一个提供者。因为,在寄存器内 方法,我们无法保证所有其他提供商都已加载了 您尝试使用的服务可能尚未提供。所以,服务 使用其他服务的提供程序代码应始终存在于引导中 方法。注册方法只应该用于,你猜对了, 向容器注册服务。在启动方法中,你 可以做任何你喜欢的事情:注册事件监听器,包括路由 文件,注册过滤器或任何你能想象到的东西。“
因此寄存器1仅用于绑定。引导一个实际上 触发事情发生。
答案 1 :(得分:2)
它们应该放在引导方法中。注册方法不保证在您需要时可以解决依赖关系。使用启动方法,您可以获得保证。正如您所提到的,理想情况下,您应该为视图编辑器创建一个单独的服务提供程序。