自动布线:2个想要彼此交谈的应用程序库(服务)

时间:2018-03-08 20:41:31

标签: autowired symfony4

当两个图书馆希望双向访问(某些)彼此的公共函数时,我遇到了注册为应用程序服务的库的依赖注入自动布线方法的问题。

看来,如果您尝试将服务A注入服务B,反之亦然,那么最终会出现循环引用错误:

Circular reference detected for service "App\Library\ServiceALibrary", path: "App\Library\ServiceALibrary-> App\Library\ServiceBLibrary -> App\Library\ServiceALibrary".

-

一个粗略的例子......让我们想象一下这两个服务库:

  • LanguageLib:负责处理管理界面中可管理的翻译。 (数据库存储而不是应用程序源中的一堆文件。)
  • SlugLib:负责使用预定义格式生成基于字符串的slugs和标签。 是的,我知道Cocur / Slugify,现在这无关紧要。

语言表不知道一个新的短语,因此translate()函数中的语言库将创建一个存根短语,以便以后可以进行翻译。

语言库现在将要求slug库提供特定格式的标记。但是哦,不! slug库不喜欢语言库的参数,因此它会抛出翻译的错误消息。这当然意味着要求语言库的翻译功能。

您无需担心这里的确切模型逻辑。重要的是,2个服务库希望能够在自己的逻辑中使用彼此的公共功能,同时通过在两个库中都拥有该功能的副本来避免重复。

-

关于问题。

在Symfony的先前(之前的)版本中,将服务容器注入库中是可以接受的,然后每个库可以通过$this->container->get("languageLib")之类的东西获取另一个服务的实例。我甚至可以在Symfony 4上继续这样做,但是目前的“最佳实践”继续告诉我这样做有多么错误。 如果可行的话,我很乐意接受最新的最佳实践。

如何让2个服务库能够使用符合Symfony 4标准的彼此公共功能? (不注入服务容器。)

我确实尝试为这些库创建接口,例如SlugLibraryInterfaceLanguageLibraryInterface,然后将接口注入库构造函数而不是库类本身:

  • LanguageLibraryInterface
  • 中输入提示SlugLibrary::__construct()
  • SlugLibraryInterface
  • 中输入提示LanguageLibrary::__construct()

这并没有解决循环引用问题,命令php bin/console debug:autowiring仍然声称库类(不是接口类)有一个循环引用。

0 个答案:

没有答案