Слушатель зарегистрирован несколько раз - PullRequest
0 голосов
/ 23 января 2020

после регистрации комбо-прослушивателя событий в EventServiceProvider.php при запуске 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 Ответ

2 голосов
/ 24 января 2020

Слушатель @handle поступает из Laravel Обнаружения событий , которое по умолчанию отключено.

Похоже, что event:list использует обнаружение событий , даже если оно отключено, но эти слушатели фактически не сработают. Обратите внимание, что Я на самом деле не проверял этот , поэтому я бы предложил добавить запись в журнал в методе handle (и удалить dd), а затем вручную запустить событие и проверить, что только одна запись в журнале.

В качестве альтернативы вы можете включить обнаружение событий и удалить ручную регистрацию в вашем EventServiceProvider.

Обновление: После сканирования Laravel все слушатели, использующие рефлексию, рекомендуется кэшировать своих слушателей в рабочем режиме с помощью php artisan event:cache.

. закрытая ошибка по этой проблеме. Я добавил комментарий, чтобы подтвердить, правильно ли он был закрыт.

...