即使触发了事件,Laravel Listener也不会触发

时间:2018-10-17 16:53:32

标签: php laravel laravel-5 laravel-5.7 laravel-events

我正在使用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

2 个答案:

答案 0 :(得分:1)

首先使用注释中指出的

event(new ItemCreated($item)); 

而不是

broadcast(new ItemCreated($item));

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

php artisan queue:work

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

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

答案 1 :(得分:1)

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