问题描述
我正在控制器中创建一条消息,然后在成功创建消息后触发一个事件:
public function store(Conversation $conversation,Request $request)
{
$message = Message::create(...)
event(new MessageCreated($message));
return response([
'message' => $message,]);
}
现在,该事件上有几个侦听器,其中一个侦听器检查它是否可以通过外部提供程序发送消息。如果失败,我在侦听器中所做的事情将引发错误。
我不了解监听器的异常跟踪如何作为对POST /message
请求的响应,因为我是在事件之后立即返回的。接下来,如果出现故障,我想返回一个自定义响应,这样我就可以正常地进行故障了,并且可以肯定地行得通:
try {
event(new MessageCreated($message));
} catch (\Exception $e) {
return 'Failed';
}
但是...为什么起作用?看来很不对劲。有没有更标准的方式来处理这个问题?
解决方法
根据您的代码,我认为这不是排队事件。在这种情况下,此事件的执行不是异步而是同步。
我的意思是说执行全部交给了您
event(new MessageCreated($message));
然后“召唤”(可以这么说)一段代码(在您的情况下为MessageCreated($ message)),然后引发异常。但是,该异常会在您的处理程序(App \ Exceptions \ Handler)中捕获,并作为500服务器错误返回。
您可以在那里捕获那些异常并忽略它们,或者可以使用文档https://laravel.com/docs/7.x/events#defining-listeners
中写的内容阻止事件的传播
有时,您可能希望停止将事件传播到其他侦听器。您可以通过从侦听器的handle方法返回false来实现。