我使用Symfony 4,有自定义事件和订阅者,例如CustomEvent和CustomEventSubscriber。存在发送CustomEvent的模块,例如CustomModule。该模块在控制器(ControllerA(和命令(CommandB(中使用。
换句话说,可能出现以下两种情况:
ControllerA -> CustomModule -> CustomEventSubscriber(CustomEvent)
或
CommandB -> CustomModule -> CustomEventSubscriber(CustomEvent)
CustomEventSubscriber中的逻辑略有不同,这取决于调用CustomModule的位置(ControllerA或CommandB(。
如何将该信息传递给CustomEventSubscriber
?
我可以将$context
属性添加到CustomEvent
中,并在CustomModule
中进行设置。但在这种情况下,我应该将有关上下文的信息传递给CustomModule
。
或者我可以使用一些全局设置,例如容器?
或者为每个CustomEvent创建两个不同的事件订阅者,禁用自动连接,并在ControllerA和CommandB中"手动"初始化并添加到调度器?
无需创建全局变量、传递容器或任何其他反模式机制。
将信息从事件调度到事件处理的明显位置是事件本身。
理想情况下,您可以创建自己的自定义事件类,其中包含执行后续工作所需的任何属性。
自定义事件将根据您的应用程序进行定制,您可以专门侦听这些事件,而不必与getSubject()
进行检查,以查看侦听器是否应该真正处理该事件。
使用泛型是很好的,尽管表达能力要差得多。如果你dispatch(new CustomerCreatedEvent())
,很明显发生了什么。
这是您的订阅者应该监听的事件,并且它已经包含了在调度上下文中收集的所有必要信息。