2015-07-09 6 views
7

I documenti di Laravel dicono che dovrei inserire gli eventi del modello nel metodo EventServiceProvider boot() in questo modo.dove ho messo il listener di eventi di salvataggio del modello in laravel 5.1

public function boot(DispatcherContract $events) 
{ 

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

} 

Ma ho molti modelli che voglio ascoltare.
Quindi mi chiedevo se fosse il modo giusto per inserire tutto nel EventServiceProvider.

risposta

6

È possibile registrare callback ascoltatore nei modelli avvio metodo, per es .:

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

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

non è così laravel –

+1

E 'vero che la documentazione raccomanda un approccio alternativo, ma non dice esplicitamente che questo è male. In una certa misura è più chiaro qui perché posso guardare il mio modello e so quali eventi hanno ascoltatori anziché fare il tifo in giro in un fornitore di servizi che punta a un osservatore da qualche parte. Forse se hai molti ascoltatori è meglio altrove. – omarjebari

+2

Sono d'accordo con Omar. a volte devi allontanarti dall'essere troppo fanatico. questa soluzione risolve bene il dilemma in un modo che non ti lascerà andare WTF in 8 mesi quando devi modificare qualcosa. –

10

Sì quello è corretto, il EventServiceProvider è il posto migliore per esso.

Tuttavia è possibile creare osservatori per mantenerlo pulito. Ti darò un rapido esempio.

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

Il Observer sarà il luogo in cui il saved, updated, created, ecc .. saranno eseguiti funzioni.
Maggiori informazioni su osservatori: http://laravel.com/docs/5.0/eloquent#model-observers

+0

dove si inserisce UserObserver (il nome della cartella, il nome del file ...)? –

+1

@JeremieGes Ho creato una nuova cartella nella directory App chiamata Observers. Dopo averlo fatto, ho creato un file chiamato UserObserver.php all'interno della directory App \ Oberservers. – Szenis

+0

Devo registrare qualcosa in composit.json? –