【发布时间】:2021-10-15 16:08:12
【问题描述】:
我在 Symfony 4.4 应用程序中遇到问题,其中有十几个侦听器正在侦听扩展 Symfony\Contracts\EventDispatcher\Event 的单个事件。问题是,如果其中一个监听器抛出异常,那么后面的监听器都不会被执行。
我一直在寻找一种方法来捕获侦听器的异常,以免发生这种情况。我尝试扩展 Symfony\Component\EventDispatcher\EventDispatcher 并覆盖 callListeners() 方法以包含 try/catch 以便我可以记录异常但继续执行。但我不知道如何告诉 Symfony 使用我的 EventDispatcher 而不是它自己的。
我不知道这是否是解决此问题的推荐方法。知道如何让它工作,或者是否有其他选择?
【问题讨论】:
-
@yivi 如果我们有异步事件处理,我们不会有问题,但我们还没有。但是每个听众都做不同的工作,应该完全独立于其他听众。并不是我们不希望出现问题时出现异常。只是一个侦听器中的异常不应阻止所有其他需要执行其任务的侦听器。例如,如果我们有一个订单事件和一个支付处理监听器和一个电子邮件通知监听器,那么支付处理不应该仅仅因为发送电子邮件通知出错而停止。
-
再一次,看起来您正在使用事件调度程序来处理它不太适合的事情。考虑到您所描述的内容,您应该查看诸如 Symfony Messenger 或 Tactician 之类的东西并使用真正的异步处理,或者干脆不使用异常来控制事件调度程序侦听器中的流程。
-
您通常可以通过添加编译器通道、获取服务定义然后设置新类来覆盖核心类。看看会发生什么样的意外副作用会很有趣。 stackoverflow.com/questions/62722129/…
-
谢谢@Cerad,我会调查的!我理解@yivi 提到我们试图实现的目标可能是不寻常的,也许不值得推荐,但这就是我们目前所处的情况。目前我们决定尝试使用
SimpleBus及其处理事件EventBus而不是 Symfony 的EventDispatcher。原因是这使我们能够轻松地使用中间件来捕获和记录异常,而无需停止其余的侦听器。稍后我们将不得不重新考虑我们的方法,但现在这会奏效。
标签: php symfony error-handling symfony-eventdispatcher