【问题标题】:why event listener not return false为什么事件监听器不返回 false
【发布时间】:2018-05-26 18:01:31
【问题描述】:

我有一些活动Samevent
例如我的事件有两个监听器;
$result = event(新Samevent());
我一定是检查结果;

1例
FirstListener返回假;
SecondListener返回假;
dd($result) = [];

2例
FirstListener返回假;
SecondListener返回真;
dd($result) = [];

3 箱
FirstListener 返回 true;
SecondListener 返回 false;
dd($result) = [true];

4例
FirstListener返回真;
SecondListener返回真;
dd($result) = [true, true];
为什么会这样??我该如何解决它

【问题讨论】:

  • 事件和监听器不是这样工作的。你不能得到这样的听众的结果。在实际示例中,请求生命周期结束后,大量事件在单独的队列中运行
  • 此侦听器不可排队
  • @Davit 您目前对上述问题有何看法?你有什么明确的想法吗?如果你有请与我分享。谢谢。
  • @Dev 不,我对此没有任何新想法

标签: laravel events listeners


【解决方案1】:

这里的每个人都说这是对事件和监听器的误用,因为它们的全部目的是异步触发。当您触发侦听器时,无法保证该侦听器的内容在触发它的事物继续执行之前完成执行。因此,他们不会提供退货服务。

更多关于为什么您认为所需的逻辑必须来自侦听器的详细信息会有所帮助,我们也许可以指导您找到更好的模式。不过现在,我想说你有几个选择。按优先顺序:

  1. 将Listener 的handle() 方法的内容抽象为一个全新的服务类。您当前认为需要访问此 Listener 的类以及 Listener 本身可以相互独立地引用此 Service 类。
  2. 不要从 Event 中触发 Listener 类。相反,将其实例化为普通类,然后直接调用它的 handle() 方法以获得所需的响应。
  3. 设置config(['app.queue_driver' => 'sync']) 以确保同步触发侦听器。 (确保在触发打算同步的侦听器后在后续行中将其改回,否则这可能会对您的应用程序的其余部分产生意想不到的后果。)然后更改您的侦听器,以便存储任何 handle()在可由其中的新 Getter 方法访问的属性中。但是,不建议使用此选项。它可以完成,但是太草率了,我什至犹豫不决。但我对为了单元测试而让我的代码做一些奇怪的事情并不陌生,所以我不会假设知道你的情况。

【讨论】:

    【解决方案2】:

    如果您需要从函数中获取结果,则不应使用事件系统来触发该函数。

    您应该通过以下两种方式之一重构您的代码:

    1) 停止使用事件,并使用非排队作业/交互之类的东西。

    $interaction = new Interaction;
    $result = $interaction->handle($vars);
    
    dd($result);
    

    2) 将所有需要的变量传递到事件中,以便您的侦听器可以在侦听器本身内进行任何事件后处理。

    【讨论】:

    • 我必须使用事件监听器。
    猜你喜欢
    • 1970-01-01
    • 2011-10-02
    • 2023-04-04
    • 2021-04-22
    • 1970-01-01
    • 2019-06-03
    • 2013-03-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多