侦听器已多次注册

时间:2020-01-23 14:33:15

标签: php laravel events laravel-6

EventServiceProvider.php中注册一个event-listener-combo后,运行php artisan event:list时会显示两个侦听器:

+-----------------------------------+-------------------------------------------------------------+
| Event                             | Listeners                                                   |
+-----------------------------------+-------------------------------------------------------------+
| App\Events\VillageCreated         | App\Listeners\VillageInitializer@handle                     |
|                                   | App\Listeners\VillageInitializer                            |
| Illuminate\Auth\Events\Registered | Illuminate\Auth\Listeners\SendEmailVerificationNotification |
+-----------------------------------+-------------------------------------------------------------+

我还不确定如何处理@handle部分,因为该部分尚未注册。

这是侦听器:

<?php
namespace App\Listeners;
use App\Events\VillageCreated;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Queue\InteractsWithQueue;

class VillageInitializer
{
    /**
     * Create the event listener.
     *
     * @return void
     */
    public function __construct()
    {
        //
    }

    /**
     * Handle the event.
     *
     * @param  VillageCreated  $event
     * @return void
     */
    public function handle(VillageCreated $event)
    {
        //
        dd('Hello');
        $initBuildings = \App\Building::where('min_level', '>', 0)->get();
        $event->village->buildings()->attachMany($initBuildings);

    }
}

这对触发事件有影响吗?

1 个答案:

答案 0 :(得分:2)

@handle侦听器来自Laravel的Event Discovery,默认情况下已禁用。

即使event:list uses event discovery似乎被禁用,但这些监听器实际上不会触发。请注意,我实际上并未对此进行测试,因此建议您在handle方法内向日志添加一个条目(并删除dd),然后手动触发事件,并检查日志中是否只有一个条目。

或者,您可以启用事件发现功能并删除EventServiceProvider中的手动注册。

更新:由于Laravel使用反射方式扫描所有侦听器,建议使用php artisan event:cache将侦听器缓存在生产环境中。

此问题有a closed bug。我添加了一条评论,以确认是否已正确关闭。