Обработчик событий Laravel 5 не запускается

Итак, я пробую новую методологию событий Laravel 5.

В моем репозитории я запускаю событие KitchenStored следующим образом:

//  Events
use App\Events\KitchenStored;

class EloquentKitchen implements KitchenInterface {

    public function store($input) {
        $kitchen        = new $this->kitchen;
        $kitchen->name  = $input['name'];
        $kitchen->save();

        \Event::fire(new KitchenStored($kitchen));

        return $kitchen;
    }

Что успешно запускает это событие:

<?php namespace App\Events;

use App\Events\Event;

use Illuminate\Queue\SerializesModels;

class KitchenStored extends Event {

    use SerializesModels;

    /**
     * Create a new event instance.
     *
     * @return void
     */
    public function __construct($kitchen)
    {
        $this->kitchen  = $kitchen;
    }

}

Однако он не связан с этим обработчиком:

<?php namespace App\Handlers\Events;

use App\Events\KitchenStored;

use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Contracts\Queue\ShouldBeQueued;

class AttachCurrentUserToKitchen {

    /**
     * Create the event handler.
     *
     * @return void
     */
    public function __construct()
    {
        dd('handler');
    }

    /**
     * Handle the event.
     *
     * @param  KitchenStored  $event
     * @return void
     */
    public function handle(KitchenStored $event)
    {
        //
    }

}

что я знаю, потому что dd ('обработчик'); не запускается во время жизненного цикла запроса.

Я зарегистрировал событие с его слушателем здесь:

<?php namespace App\Providers;

use Illuminate\Contracts\Events\Dispatcher as DispatcherContract;
use Illuminate\Foundation\Support\Providers\EventServiceProvider as ServiceProvider;

class EventServiceProvider extends ServiceProvider {

    /**
     * The event handler mappings for the application.
     *
     * @var array
     */
    protected $listen = [
        App\Events\KitchenStored::class => [
            App\Handlers\Events\AttachCurrentUserToKitchen::class
        ]
    ];

    /**
     * Register any other events for your application.
     *
     * @param  \Illuminate\Contracts\Events\Dispatcher  $events
     * @return void
     */
    public function boot(DispatcherContract $events)
    {
        parent::boot($events);
        Event::listen('App\Events\KitchenStored',
                    'App\Handlers\Events\AttachCurrentUserToKitchen');
    }

}

Может ли кто-нибудь лучше объяснить этот процесс, чтобы я мог продолжать использовать самый чистый код, который у меня есть на сегодняшний день?

Большое спасибо


person Ed Stephenson    schedule 01.02.2015    source источник


Ответы (8)


В EventServiceProvider.php включите начальный \ при ссылке на класс с использованием обозначения ::class:

protected $listener = [
    \App\Events\KitchenStored::class => [
      \App\Handlers\Events\AttachCurrentUserToKitchen::class,
    ],
];

Вы также можете добавить use операторов и сделать сопоставления ваших слушателей короткими:

use App\Events\KitchenStored;
use App\Handlers\Events\AttachCurrentUserToKitchen;
...
protected $listener = [
    KitchenStored::class => [
      AttachCurrentUserToKitchen:class,
    ],
];

Или просто используйте строковое обозначение:

protected $listener = [
    'App\Events\KitchenStored' => [
      'App\Handlers\Events\AttachCurrentUserToKitchen',
    ],
];
person John Berberich    schedule 23.06.2015
comment
Лучше использовать нотацию :: class из-за автозаполнения, что позволяет избежать орфографических ошибок. - person Geoffrey; 27.10.2017
comment
@systemovich omg да ... переместил слушателя, и он перестал работать, все пути были автоматически отредактированы, кроме этого, потребовалось много времени, чтобы найти эту проблему, потому что она не выдает ошибку - person Matt K; 31.01.2018
comment
Похоже на отличное предложение (я всегда хочу избегать строк), но, к сожалению, не решило проблему для меня. - person Ryan; 31.08.2019

Если вы запустите php artisan optimize, ваши обработчики событий должны начать прослушивание.

За это спасибо mattstauffer из larachat slack channel.

person Carter Fort    schedule 09.02.2015
comment
Действительно глупо, но я решил свою проблему, убедившись, что импортировал правильные классы в класс EventServiceProvider. - person adis; 23.05.2015
comment
Опять же, как и composer dump-autoload, это определенно может быть решением, но не решением для пользователя прямо сейчас! - person Mathieu Dumoulin; 02.09.2016
comment
Это не помогло. Laravel 7, трансляция событий с событием (новое СОБЫТИЕ) → работает над постановкой, но не над производством. - person Stanislav Stankov; 09.10.2020

Я побежал

composer dumpautoload

с последующим

php artisan clear-compiled

Затем начались мои события.

person jb360    schedule 04.06.2015
comment
В среде без отладки это определенно могло быть причиной. Я абсолютно согласен! - person Mathieu Dumoulin; 02.09.2016
comment
Это сработало для меня. Я пытался добавить событие и слушателей в настраиваемый пакет, который я пишу. Я разработал их в своем реальном приложении, но затем, когда я переместил их в пакет, я продолжал получать ошибку class not found для слушателей. Это сработало как шарм! - person Amy Lashley; 17.08.2017
comment
да, иногда бывает так: / - person Agil; 17.02.2019
comment
У меня не работает. У меня все работает нормально, но продюсеру все еще не повезло с ними. - person Stanislav Stankov; 09.10.2020

Не походите на меня и кешируйте свои события локально, чтобы что-то протестировать, а затем забудьте очистить этот кеш ????

php artisan event:clear
person Sebastiaan Luca    schedule 07.12.2020

У меня была аналогичная проблема, и я исправил ее, удалив файл vendor \ compiled.php. Затем я снова запускаю "composer update", и теперь обработчик запускается, как ожидалось.

person kururin    schedule 03.05.2015

Для меня у меня была проблема, когда у меня было несколько слушателей для одного события. В этом случае слушатели выполняются по порядку. Однако, если один из слушателей возвращает false, все остальные слушатели не выполняются.

person Raza    schedule 27.01.2021

Убедитесь, что ваш EventServiceProvider вызывает функцию родительского регистра.

public function register() {
   parent::register():
}
person Jeremy    schedule 23.03.2021

Это старый вопрос, но я столкнулся с той же проблемой, и для меня это было потому, что я добавил свое новое событие к поставщику услуг, но, что особенно важно, я не импортировал его. Если вы столкнулись с этой проблемой в 2020 году, убедитесь, что вы импортировали событие.

person James Stewart    schedule 26.09.2020