即使事件被触发,Laravel 监听器也没有被触发

Posted

技术标签:

【中文标题】即使事件被触发,Laravel 监听器也没有被触发【英文标题】:Laravel Listener not fired even though the event was triggered 【发布时间】:2019-03-22 10:24:05 【问题描述】:

我正在使用 Laravel 框架开发一个 Web 应用程序。我正在尝试在我的应用程序中使用事件和侦听器。但是事件被触发了,并且触发事件的监听器没有被触发。

这是我的控制器操作

    public function store(Request $request)
    

        //other code
        $item = Item::create($request->all())
        broadcast(new ItemCreated($item));
        return "Item created successfully";
    

这是我的 Events\ItemCreated.php

class ItemCreated

    use Dispatchable, InteractsWithSockets, SerializesModels;

    public $item;

    public function __construct($item)
    
        $this->item = $item;
    

那么我就有了那个事件的监听器。

Listeners/EmailSubscribedUsers.php

class EmailSubscribedUsers


    public function __construct()
    
        //this constructor is not triggered
    


    public function handle(ItemCreated $event)
    
        //This method is not fired
     

在 EventServiceProvider 中,我像这样注册了事件和监听器

protected $listen = [

    ItemCreated::class => [
        EmailSubscribedUsers::class
    ]
];

事件被触发。但是听众没有被解雇。为什么?怎么了?

我尝试了以下解决方案。

php artisan optimize
composer dumpautoload
php artisan clear-compiled

【问题讨论】:

你运行的是什么版本?好久没用optimize和clear-compiled了。 最新的 Laravel (5.7)。 我猜您的实际代码与您发布的不同。例如,您的听众是queueable?如果是,您是否运行过artisan queue:work 我的感觉是,如果您发布您的real 代码,我们或许可以提供帮助 broadcast() 不应该是event() 【参考方案1】:

对不起大家。问题是我在进行单元测试。在单元测试中,如果我使用 Event::fake(),则不会触发事件侦听器。我想测试事件侦听器中的逻辑。因此,我删除了 Event::fake() 并改为在侦听器中测试逻辑。

【讨论】:

【参考方案2】:

首先正如在 cmets 中指出的那样使用

event(new ItemCreated($item)); 

而不是

broadcast(new ItemCreated($item));

此外,请确保您已在 .env 文件中将 QUEUE_CONNECTION 设置为 sync。如果您使用了其他连接(例如 databaseRedis),请确保您在控制台命令中运行:

php artisan queue:work

最后一件事 - 验证您在 storage/logs 目录中的错误日志。您可能还有其他一些错误(例如缺少导入),这就是您的侦听器失败的原因。

还要确保在 EventServiceProvider 中使用有效的类并导入有效的命名空间 - 否则不会触发侦听器。

【讨论】:

实际上监听器被触发了。它只是没有在单元测试中触发。 @WaiYanHein 好吧,您的问题中没有提到这一点。你怎么知道它没有被解雇?您知道在phpunit.xml 中可能为队列设置了不同的驱动程序吗?您的测试结果如何? 我稍后会发布我的测试 QUEUE_CONNECTION 同步解决我的问题

以上是关于即使事件被触发,Laravel 监听器也没有被触发的主要内容,如果未能解决你的问题,请参考以下文章

为啥我的事件监听器没有在 laravel 5 中触发?

即使由用户事件触发,Facebook 权限弹出窗口也会被阻止。为啥?

Laravel Scheduler作业触发失败事件,即使它没有失败

vue+mousemove移入事件只触发一次怎么设置?

RxJava 作为事件总线被多次调用,即使只触发一次

为什么我的(javascript)变化事件没有在我的测试中被触发?