如何解决请求中的Laravel优美的结束事件监听器
我正在控制器中创建一条消息,然后在成功创建消息后触发一个事件:
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来实现。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。