2015-07-09 4 views
7

Die Laravel-Dokumente sagen, dass ich die Modellereignisse in der EventServiceProvider boot() Methode wie folgt setzen sollte.wo soll ich Modell speichern Ereignis-Listener in Laravel 5.1

public function boot(DispatcherContract $events) 
{ 

    Raisefund::saved(function ($project) { 
     //do something 
    }); 

} 

Aber ich habe viele Modelle, die ich hören will.
Also habe ich mich gefragt, ob es der richtige Weg ist, alles in die EventServiceProvider10 zu setzen.

Antwort

6

Sie können Zuhörer Rückrufe in Ihren Modellen Boot Verfahren, z.B .:

class User extends Eloquent { 
    protected static function boot() { 
    parent::boot(); 

    static::deleting(function($user) { 
     //deleting listener logic 
    }); 
} 
+0

es ist nicht Laravel Weise –

+1

Es ist wahr, dass die Dokumentation einen alternativen Ansatz empfiehlt jedoch nicht explizit sagen, dass dies schlecht ist. Bis zu einem gewissen Grad ist es hier klarer, da ich mein Modell betrachten kann und ich weiß, welche Ereignisse Zuhörer haben, im Gegensatz zu einem Dienstanbieter, der irgendwo auf einen Beobachter verweist. Vielleicht, wenn Sie viele Zuhörer haben, ist es anderswo besser. – omarjebari

+2

Ich stimme Omar zu. Manchmal muss man sich davon abhalten, zu fanatisch zu sein. Diese Lösung löst das Dilemma auf eine Art und Weise, die Sie nicht in 8 Monaten in WTF versetzt, wenn Sie etwas optimieren müssen. –

10

Ja, das ist richtig, das EventServiceProvider ist der beste Platz für sie registrieren.

Sie können jedoch Beobachter erstellen, um sie sauber zu halten. Ich werde dir ein schnelles Beispiel geben.

EventServiceProvider

<?php 

namespace App\Providers; 

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

use App\Models\Users; 
use App\Observers\UserObserver; 

/** 
* Event service provider class 
*/ 
class EventServiceProvider extends ServiceProvider 
{ 
    /** 
    * Boot function 
    * 
    * @param DispatcherContract $events 
    */ 
    public function boot(DispatcherContract $events) 
    { 
     parent::boot($events); 

     Users::observe(new UserObserver()); 
    } 
} 

UserObserver

<?php 

namespace App\Observers; 

/** 
* Observes the Users model 
*/ 
class UserObserver 
{ 
    /** 
    * Function will be triggerd when a user is updated 
    * 
    * @param Users $model 
    */ 
    public function updated($model) 
    { 
    } 
} 

Die Observer wird der Ort sein, wo die saved, updated, created, etc .. Funktionen ausgeführt werden.
Mehr Informationen über Beobachter: http://laravel.com/docs/5.0/eloquent#model-observers

+0

wo Sie den UserObserver setzen (der Name des Ordners, der Name der Datei ...)? –

+1

@ JeremieGes Ich habe einen neuen Ordner im App-Verzeichnis namens Observer erstellt. Nachdem ich das gemacht habe, habe ich eine Datei namens UserObserver.php im Verzeichnis App \ Oberserver erstellt. – Szenis

+0

Muss ich etwas in composer.json registrieren? –