Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/78.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 请求中的Laravel优雅结束事件侦听器_Php_Laravel_Events_Laravel 7 - Fatal编程技术网

Php 请求中的Laravel优雅结束事件侦听器

Php 请求中的Laravel优雅结束事件侦听器,php,laravel,events,laravel-7,Php,Laravel,Events,Laravel 7,在我的控制器中,我正在创建一条消息,该消息在成功创建消息后触发一个事件: public function store(Conversation $conversation, Request $request) { $message = Message::create(...) event(new MessageCreated($message)); return response([ 'message' => $message,

在我的控制器中,我正在创建一条消息,该消息在成功创建消息后触发一个事件:

public function store(Conversation $conversation, Request $request)
{
    $message = Message::create(...)
       
    event(new MessageCreated($message));

    return response([
        'message' => $message,
    ]);
}
现在,事件上有几个侦听器,其中一个侦听器检查是否可以通过外部提供程序发送消息。我在侦听器中所做的是,如果某个操作失败,则抛出一个错误

我不明白侦听器的异常跟踪怎么会作为对POST/消息请求的响应,因为我在事件发生后立即返回。接下来,如果某个东西失败了,我想返回一个自定义响应,这样我就可以优雅地失败了,这确实有效:

try {
    event(new MessageCreated($message));
} catch (\Exception $e) {
    return 'failed';
}

但是…为什么它会起作用?这似乎大错特错。是否有更标准的方法来处理此问题?

根据您的代码,我假设这不是排队事件。在这种情况下,此事件的执行不是异步的,而是同步的

我的意思是,执行死刑完全是为了你自己 eventnewmessagecreated$message; 然后在您的案例MessageCreated$message中调用一段代码,然后抛出一个异常。但是,该异常会在处理程序App\Exceptions\handler中捕获,并作为500服务器错误返回

您可以在那里捕获这些异常并忽略它们,也可以使用文档中所写的内容

停止事件的传播

有时,您可能希望停止向其他侦听器传播事件。您可以通过从侦听器的handle方法返回false来实现