Laravel中的服务提供商和IoC

时间:2015-03-10 22:24:09

标签: php laravel inversion-of-control service-provider

我正在阅读教程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"
    ];
}

我对一些事情感到有些困惑:

  1. 为什么不让provides函数中的字符串(特别是" chat.server")与register函数中绑定的字符串相匹配?是不是必须告诉IoC什么是可用的以及将会绑定什么?

  2. 当某些内容被app绑定时,用于绑定它的字符串的约定是什么?例如,在上面的代码中," chat.emitter"返回EventEmitter,但类EventEmitter与聊天文件夹无关。事实上,它位于Evenement包中。此外,"聊天"不是namspace的顶部,Formativ是。为什么不是" formativ.chat.user"?那么,这里的标准是什么?该字符串的每一部分是什么意思?

1 个答案:

答案 0 :(得分:1)

  

为什么不提供函数中的字符串(特别是" chat.server")与寄存器函数中绑定的内容相匹配?是不是必须告诉IoC什么是可用的以及将会绑定什么?

看起来像教程中的错误/拼写错误。 FWIW,用户和服务器(chat.user / chat.server - 不匹配的提供商)在你快速写作时非常容易交换。

  

当应用程序绑定某些内容时,用于绑定它的字符串的约定是什么?

没有。这些服务提供商旨在成为服务的全球(如整个世界)标识符。没有强制命名惯例,而且从我所看到的Laravel是一个小/孤立的社区,这不是一个主要问题。如果我要重新分发服务提供商,我会使用类似

的命名约定
companyname_servicename

companyname部分是我公司/项目的唯一命名空间,servicename标识服务的功能。虽然在避免命名空间冲突方面不是100%确定性,但确保人们需要尽力选择一个与我的冲突的名称。

您无法从服务名称中获取有关基础类的任何信息 - 即使您可以,IoC容器的重点是让用户在需要时交换不同的实现。这意味着即使您可以从服务名称派生类名,您也不​​会知道其他开发人员和/或第三方软件包的功能。

希望有所帮助!