web-dev-qa-db-fra.com

Laravel 5 gestionnaire d'événement ne tire pas

J'essaie donc la nouvelle méthodologie Laravel 5 Event.

Dans mon référentiel, je déclenche l'événement "KitchenStored" comme suit:

//  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;
    }

Qui déclenche avec succès cet événement:

<?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;
    }

}

Cependant, cela ne relie pas à ce gestionnaire:

<?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)
    {
        //
    }

}

que je connais parce que le dd ('handler'); n'est pas déclenché pendant le cycle de vie de la demande.

J'ai enregistré l'événement avec son auditeur ici:

<?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');
    }

}

Quelqu'un peut-il expliquer ce processus mieux afin que je puisse continuer avec le code le plus propre que j'ai à ce jour?

Merci beaucoup

12
Ed Stephenson

Dans EventServiceProvider.php, incluez le \ initial lorsque vous faites référence à une classe en utilisant la notation ::class:

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

Vous pouvez également ajouter des instructions use et garder vos correspondances d'écoute courtes:

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

Ou utilisez simplement la notation de chaîne:

protected $listener = [
    'App\Events\KitchenStored' => [
      'App\Handlers\Events\AttachCurrentUserToKitchen',
    ],
];
19
John Berberich

Si vous exécutez php artisan optimize, vos gestionnaires d'événements doivent commencer à écouter.

Crédit à mattstauffer du canal de larachat slack pour celui-là.

16
Carter Fort

Iran

composer dumpautoload

suivi par 

php artisan clear-compiled

Puis mes événements ont commencé à tirer.

11
jb360

J'ai eu un problème similaire et je l'ai corrigé en supprimant le fichier vendor\compiled.php. Ensuite, je lance à nouveau "composer mise à jour" et maintenant le gestionnaire se déclenche comme prévu.

0
kururin