Laravel 请求中的优雅结束事件侦听器
Laravel graceful end event-listener within a request
在我的控制器中,我正在创建一条消息,然后在成功创建消息后触发一个事件:
public function store(Conversation $conversation, Request $request)
{
$message = Message::create(...)
event(new MessageCreated($message));
return response([
'message' => $message,
]);
}
现在事件上有几个侦听器,其中一个侦听器检查它是否可以通过外部提供程序发送消息。我在侦听器中所做的是在出现故障时抛出错误。
我不明白监听器的异常跟踪怎么会作为对 POST /message
请求的响应,因为我 return 在事件发生后立即进行。之后,我想 return 如果某事失败了,我可以自定义响应,这样我就可以优雅地失败,而且这确实有效:
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
停止传播事件
Sometimes, you may wish to stop the propagation of an event to other listeners. You may do so by returning false from your listener's handle method.
在我的控制器中,我正在创建一条消息,然后在成功创建消息后触发一个事件:
public function store(Conversation $conversation, Request $request)
{
$message = Message::create(...)
event(new MessageCreated($message));
return response([
'message' => $message,
]);
}
现在事件上有几个侦听器,其中一个侦听器检查它是否可以通过外部提供程序发送消息。我在侦听器中所做的是在出现故障时抛出错误。
我不明白监听器的异常跟踪怎么会作为对 POST /message
请求的响应,因为我 return 在事件发生后立即进行。之后,我想 return 如果某事失败了,我可以自定义响应,这样我就可以优雅地失败,而且这确实有效:
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
停止传播事件
Sometimes, you may wish to stop the propagation of an event to other listeners. You may do so by returning false from your listener's handle method.