【发布时间】:2020-02-07 08:19:29
【问题描述】:
在 Symfony 中,您可以使用相同的接口 DI 不同的服务,如下所示:
public function __construct(ServiceInterface $serviceOne, ServiceInterface $serviceTwo)
但是如何使用ServiceSubscriberInterface 以同样的方式实现这一点?
public static function getSubscribedServices()
{
return [
'commandBus' => MessageBusInterface::class . ' $commandBus',
'queryBus' => MessageBusInterface::class . '$queryBus',
];
}
这些是我已经检查过的资源: https://symfony.com/doc/current/service_container/service_subscribers_locators.html https://symfony.com/doc/current/messenger/multiple_buses.html
【问题讨论】:
-
您的第一个陈述略有错误,这种情况很少见,据我所知,具体到 messenger 组件,它关心 var 名称。这也是我假设的原因,这对于
ServiceSubscriberInterface来说并不那么简单。但是,我假设您有一个特定的用例,如果您至少提供一些有关它的详细信息,也许可以解决该用例。 -
在docs 中,他们展示了如何使用相同的 MessageBusInterface DI $queryBus 和 $commandBus。所以我假设你也可以将它与服务定位器一起使用。
-
是的,但这是在 messenger 组件中的特殊编译器传递中完成的。对于这种特定情况,没有编译器通道可以处理 ServiceSubscriberInterfaces。如果你描述一下用例是什么,那真的很有帮助,因为有很多用例,而且大多数都有不同的方法。
-
啊哈!我的用例是我有一个需要几个服务的抽象处理程序,并且孩子可以(可选地)包含它需要的服务。我喜欢this 模式。
-
我以为 ServiceSubscriberInterface 使用同一个容器来获取服务?带有 ServiceSubscriberInterface 的服务被延迟加载,因此使用的容器应该具有来自 Messenger 编译器传递的已编译的 $queryBus 和 $commandBus。对吗?
标签: php symfony dependency-injection