【问题标题】:Service Providers and IoC in LaravelLaravel 中的服务提供者和 IoC
【发布时间】:2015-05-12 13:41:46
【问题描述】:

我正在阅读教程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”?那么,这里的标准是什么?该字符串的每一段是什么意思?

【问题讨论】:

  • provides 不准确返回用作绑定的字符串吗?在我看来是正确的
  • @lukasgeiter 我在任何地方都看不到"chat.server"。我会澄清这就是我的问题出现的地方。
  • 哦,你是对的。我想知道这是否只是教程中的一个错误......

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


【解决方案1】:

为什么提供函数(特别是“chat.server”)中的字符串与注册函数中绑定的内容不匹配?不需要提供来告诉 IoC 什么是可用的以及什么将被绑定吗?

看起来像是教程中的错误/错字。 FWIW、用户和服务器(chat.user/chat.server - 不匹配的提供程序)在您快速编写时非常容易交换。

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

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

companyname_servicename

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

您无法从服务名称派生任何有关底层类的信息——即使可以,IoC 容器的全部意义在于让用户根据需要在不同的实现中进行交换。这意味着即使您可以从服务名称派生类名称,您也不知道其他开发人员和/或第三方包做了什么。

希望有帮助!

【讨论】:

  • 没有约定,您只需选择任何看起来正确的事实,这一事实清除了许多在线文档,其中包含各种不同的示例。谢谢。
猜你喜欢
  • 2017-01-11
  • 2019-05-29
  • 2015-12-21
  • 1970-01-01
  • 2016-12-21
  • 2015-10-24
  • 2016-10-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多