我正在阅读教程here,并且我已经在ServiceProvider
中的以下代码块中运行。
public function register()
{
$this->app->bind("chat.emitter", function ()
{
return new EventEmitter();
});
$this->app->bind("chat.chat", function ()
{
return new Chat($this->app->make("chat.emitter"));
});
$this->app->bind("chat.user", function ()
{
return new User();
});
$this->app->bind("chat.command.serve", function ()
{
return new Command\Serve($this->app->make("chat.chat"));
});
$this->commands("chat.command.serve");
}
public function provides()
{
return [
"chat.chat",
"chat.command.serve",
"chat.emitter",
"chat.server"
];
}
我对一些事情感到有些困惑:
为什么不让provides
函数中的字符串(特别是" chat.server")与register
函数中绑定的字符串相匹配?是不是必须告诉IoC
什么是可用的以及将会绑定什么?
当某些内容被app
绑定时,用于绑定它的字符串的约定是什么?例如,在上面的代码中," chat.emitter"返回EventEmitter
,但类EventEmitter
与聊天文件夹无关。事实上,它位于Evenement
包中。此外,"聊天"不是namspace的顶部,Formativ
是。为什么不是" formativ.chat.user"?那么,这里的标准是什么?该字符串的每一部分是什么意思?
答案 0 :(得分:1)
为什么不提供函数中的字符串(特别是" chat.server")与寄存器函数中绑定的内容相匹配?是不是必须告诉IoC什么是可用的以及将会绑定什么?
看起来像教程中的错误/拼写错误。 FWIW,用户和服务器(chat.user
/ chat.server
- 不匹配的提供商)在你快速写作时非常容易交换。
当应用程序绑定某些内容时,用于绑定它的字符串的约定是什么?
没有。这些服务提供商旨在成为服务的全球(如整个世界)标识符。没有强制命名惯例,而且从我所看到的Laravel是一个小/孤立的社区,这不是一个主要问题。如果我要重新分发服务提供商,我会使用类似
的命名约定companyname_servicename
companyname
部分是我公司/项目的唯一命名空间,servicename
标识服务的功能。虽然在避免命名空间冲突方面不是100%确定性,但会确保人们需要尽力选择一个与我的冲突的名称。
您无法从服务名称中获取有关基础类的任何信息 - 即使您可以,IoC容器的重点是让用户在需要时交换不同的实现。这意味着即使您可以从服务名称派生类名,您也不会知道其他开发人员和/或第三方软件包的功能。
希望有所帮助!