当两个图书馆希望双向访问(某些)彼此的公共函数时,我遇到了注册为应用程序服务的库的依赖注入自动布线方法的问题。
看来,如果您尝试将服务A注入服务B,反之亦然,那么最终会出现循环引用错误:
Circular reference detected for service "App\Library\ServiceALibrary", path: "App\Library\ServiceALibrary-> App\Library\ServiceBLibrary -> App\Library\ServiceALibrary".
-
一个粗略的例子......让我们想象一下这两个服务库:
语言表不知道一个新的短语,因此translate()
函数中的语言库将创建一个存根短语,以便以后可以进行翻译。
语言库现在将要求slug库提供特定格式的标记。但是哦,不! slug库不喜欢语言库的参数,因此它会抛出翻译的错误消息。这当然意味着要求语言库的翻译功能。
您无需担心这里的确切模型逻辑。重要的是,2个服务库希望能够在自己的逻辑中使用彼此的公共功能,同时通过在两个库中都拥有该功能的副本来避免重复。
-
关于问题。
在Symfony的先前(之前的)版本中,将服务容器注入库中是可以接受的,然后每个库可以通过$this->container->get("languageLib")
之类的东西获取另一个服务的实例。我甚至可以在Symfony 4上继续这样做,但是目前的“最佳实践”继续告诉我这样做有多么错误。 如果可行的话,我很乐意接受最新的最佳实践。
如何让2个服务库能够使用符合Symfony 4标准的彼此公共功能? (不注入服务容器。)
我确实尝试为这些库创建接口,例如SlugLibraryInterface
和LanguageLibraryInterface
,然后将接口注入库构造函数而不是库类本身:
LanguageLibraryInterface
SlugLibrary::__construct()
SlugLibraryInterface
LanguageLibrary::__construct()
这并没有解决循环引用问题,命令php bin/console debug:autowiring
仍然声称库类(不是接口类)有一个循环引用。