Php 如何在Symfony 4传递上下文中传递到自定义事件订阅服务器?
我使用的是Symfony 4,有自定义事件和订阅服务器,例如CustomEvent和CustomEventSubscriber。有一个发送CustomEvent的模块,例如CustomModule。该模块在控制器ControllerA和命令CommandB中使用 换言之,可能出现以下两种情况:Php 如何在Symfony 4传递上下文中传递到自定义事件订阅服务器?,php,symfony,symfony4,symfony-eventdispatcher,Php,Symfony,Symfony4,Symfony Eventdispatcher,我使用的是Symfony 4,有自定义事件和订阅服务器,例如CustomEvent和CustomEventSubscriber。有一个发送CustomEvent的模块,例如CustomModule。该模块在控制器ControllerA和命令CommandB中使用 换言之,可能出现以下两种情况: ControllerA -> CustomModule -> CustomEventSubscriber(CustomEvent) 或 CustomEventSubscriber中的逻辑稍有
ControllerA -> CustomModule -> CustomEventSubscriber(CustomEvent)
或
CustomEventSubscriber中的逻辑稍有不同,这取决于调用CustomModule ControllerA或CommandB的位置
如何将该信息传递给CustomEventSubscriber
我可以将$context属性添加到CustomEvent并在CustomModule中设置它。但在这种情况下,我应该将有关上下文的信息传递给CustomModule
或者我可以使用一些全局设置,例如容器
或者为每个CustomEvent创建两个不同的事件订阅者,禁用自动连接,并“手动”初始化并添加到ControllerA和CommandB中的dispatcher?无需创建全局变量、传递容器或任何其他反模式机制 将信息从事件的调度位置传递到事件的处理位置的明显位置是事件本身 理想情况下,您可以创建自己的自定义事件类,其中包含执行后续工作所需的任何属性
自定义事件将根据您的应用程序进行定制,您可以专门侦听这些事件,而无需与getSubject进行检查,以查看侦听器是否应该真正处理该事件 使用泛型是很好的,尽管表达能力要差得多。如果你发送新的CustomerCreatedEvent,马上就能知道发生了什么
这是您的订阅者应该收听的事件,它已经包含在调度上下文中收集的所有必要信息。上下文是什么意思?您能否在问题中添加一些代码,以便更清楚地了解您到底想完成什么?在任何情况下,所有相关信息都应该包含在事件对象中。@yivi>通过上下文,我的意思与API平台规范化上下文中的意思相同[上下文,它随事件从一个订阅者传递到另一个订阅者。我已经开始使用带有附加参数的GenericeEvent。这样做的方法是在事件中传递您想要的任何信息。使用您需要的任何属性创建您自己的自定义事件,这是订阅者应该期望的。Andrey,下面的答案对您有帮助吗ou?有任何反馈吗?好的。使用扩展事件与GenericeEvent的自定义事件有什么优点和缺点?自定义事件将根据您的应用程序进行定制,您可以专门侦听这些事件,而无需与getSubject进行检查,以确定侦听器是否应该真正处理该事件。使用泛型是可以的,尽管表达能力要差得多。若你们分派新的CustomerCreateEvent,事情马上就会发生。我的意思是我创建了CustomerCreateEvent,它扩展了GenericeEvent,而我的订阅者期望这种类型的事件。据我所知,扩展事件和GenericeEvent之间的区别是附加事件的参数作为数组或对象属性。@yivi查看vendor/symfony/event dispatcher/event.php查看折旧注释。由于GenericEvent扩展了event,因此GenericEvent也会折旧。新事件位于vendor/symfony/event dispatcher下-contracts@yivi-看来我对GenericEvent的看法是错误的。5.0刚刚发布,GenericEvent仍然存在。它只是一个扩展从Contracts\Event结束。我仍然没有看到任何令人信服的理由来使用它,但它看起来将在不确定的未来出现。
CommandB -> CustomModule -> CustomEventSubscriber(CustomEvent)