2015-02-01 16 views
12

Also probiere ich die neue Laravel 5 Event-Methode aus.Laravel 5 Ereignishandler nicht schießend

In meinem Repository, ich bin Brennen der Veranstaltung "KitchenStored", wie er so:

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

dem dieses Ereignis erfolgreich ausgelöst:

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

} 

Allerdings ist es nicht darauf verbinden Handler:

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

} 

was ich weiß, weil die dd ('handler'); wird während des Anforderungslebenszyklus nicht ausgelöst.

Ich habe die Veranstaltung mit seinen Zuhörern hier registriert:

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

} 

Kann diesen Prozess besser jemand erklären, so kann ich mit dem saubersten Code gehen halte ich bis heute habe?

Vielen Dank

Antwort

15

In EventServiceProvider.php, umfassen die führende \ wenn eine Klasse mit der ::class Notation Referenzierung:

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

Sie auch use Aussagen hinzufügen könnte und halten Sie Ihre Zuhörer Zuordnungen kurz:

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

Oder benutzen Sie einfach die Zeichenfolgennotation:

protected $listener = [ 
    'App\Events\KitchenStored' => [ 
     'App\Handlers\Events\AttachCurrentUserToKitchen', 
    ], 
]; 
+1

Dies sollte mehr Aufmerksamkeit bekommen. Gemeinsames Problem... – AJReading

+2

Die Verwendung der :: class-Notation ist aufgrund der Autovervollständigung besser, um Rechtschreibfehler zu vermeiden. – systemovich

+1

@systemovich omg ja ... bewegte einen Listener und es hörte auf zu arbeiten, alle Pfade wurden automagisch überarbeitet, außer dieser einen, dauerte ewig, um dieses Problem zu finden, weil es keinen Fehler wirft –

14

Wenn Sie laufen php artisan optimize, Ihre Event-Handler sollten hören beginnen.

Kredit zu mattstauffer vom larachat schlaffen Kanal für diesen.

+1

Für mich löst das das Problem nicht. –

+0

Wirklich dumm, aber ich löste mein Problem, indem ich sicherstellte, dass die richtigen Klassen in der 'EventServiceProvider' Klasse importiert wurden. – adis

+0

Wieder, wie Composer Dump-Autoload, kann dies definitiv eine Lösung, aber nicht die Lösung für den Benutzer jetzt sein! –

0

Ich hatte ein ähnliches Problem und ich reparierte es, indem ich die vendor \ compiled.php Datei löschte. Dann führe ich "Composer Update" erneut aus und der Handler feuert nun wie erwartet.

7

Ich lief

composer dumpautoload 

gefolgt von

php artisan clear-compiled 

Dann feuern meine Ereignisse begann.

+0

4 upvotes, scheint die Community nicht zu stimmen. –

+0

In einer Nicht-Debug-Umgebung könnte dies definitiv die Ursache sein. Ich bin vollkommen einverstanden! –

+0

Das hat bei mir funktioniert. Ich habe versucht, einem benutzerdefinierten Paket, das ich schreibe, ein Ereignis und Listener hinzuzufügen. Ich habe sie in meiner eigentlichen App entwickelt, aber als ich sie dann in das Paket verschoben habe, habe ich immer wieder einen Fehler gefunden, der nicht auf die Klasse zutrifft. Das hat wie ein Zauber funktioniert! –