为什么事件监听器不返回false

时间:2018-05-26 18:01:32

标签: laravel events listeners

我有一些事件 Samevent 例如我的事件有两个听众;
$ result = event(new Samevent());
我必须检查结果;

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

2个案件 FirstListener返回false;
SecondListener返回true;
dd($ result)= [];

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

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

2 个答案:

答案 0 :(得分:1)

这里的每个人都说这是对事件和听众的误用是因为他们的整个目的是异步发射。当您触发侦听器时,该侦听器的内容无法在触发它的事物继续前完成执行。出于这个原因,他们没有设置提供回报。

有关为什么您认为所需逻辑必须来自监听器的更多细节会有所帮助,我们可以引导您找到更好的模式。但就目前而言,我说你有几个选择。按优先顺序排列:

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

答案 1 :(得分:0)

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

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

1)停止使用某个事件,并使用类似非排队作业/互动的内容。

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

dd($result);

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