2012-11-22 11 views

risposta

8

In realtà, Laravel ha una vera callback prima di | after save | update | crea qualche modello. controllare questo:

https://github.com/laravel/laravel/blob/3.0/laravel/database/eloquent/model.php#L362

l'EventListener come salvato e risparmio sono i veri callback

$this->fire_event('saving'); 

$this->fire_event('saved'); 

come possiamo lavorare con questo? basta assegnare a questo esempio eventListener:

\Laravel\Event::listen('eloquent.saving: User', function($user){ 
    $user->saving();//your event or model function 
}); 
+5

Questa non è più la migliore risposta con Laravel 4. http://laravel.com/docs/5.0/eloquent#model-events – Lotus

+0

La documentazione più completa che spiega gli Eventi del Modello si trova nella documentazione principale qui: https://laravel.com/docs/master/eloquent#events –

58

Il modo migliore per ottenere prima e dopo salvare i callback per estendere la funzione save().

Ecco un rapido esempio

class Page extends Eloquent { 

    public function save(array $options = []) 
    { 
     // before save code 
     parent::save(); 
     // after save code 
    } 
} 

Così ora quando si salva un oggetto pagina il suo save() funzione get chiamata, che include la funzione parent::save();

$page = new Page; 
$page->title = 'My Title'; 
$page->save(); 
+1

Questa è la soluzione migliore per rendendo funziona come CakePHP AfterSave() e BeforeSave(). In alternativa, ci sono hook di eventi nel metodo save() se si desidera applicarlo globalmente. –

+3

qui devi stare molto attento dato che non stai operando all'interno di una transazione di database. parent :: save(); completa una transizione del database. Se si salva prima e dopo, saranno anche transazioni complete. Se è necessario assicurarsi che tutti i salvataggi avvengano o falliscano, è necessario avvolgerli in un DB :: transaction(). –

+1

il modo migliore per farlo in Laravel 4 è per l'utente osservatore: http://laravel.com/docs/eloquent#model-events –

0

Se si desidera controllare il modello stesso, è possibile ignorare la funzione di salvare e inserire il codice prima o dopo __parent::save().

Altrimenti, c'è un evento attivato da ciascun modello Eloquent prima che si salva.

Vi sono anche due eventi attivati ​​quando Eloquent salva un modello.

"eloquent.saving: model_name" o "eloquent.saved: model_name".

http://laravel.com/docs/events#listening-to-events

+0

Un elenco completo di eventi che è possibile utilizzare, http://stackoverflow.com/questions/13059744/where-can-i-get-a-complete-list-of- laravel-events-fired-by-the-core-libaries – crynobone

6

Anche se questa domanda è già stata segnata 'accettato' - sto aggiungendo una nuova risposta aggiornato per laravel 4.

Beta 4 of Laravel 4 has just introduced hook events for Eloquent save events - quindi non avete bisogno di estendere più il nucleo:

Aggiunti i metodi Model :: creation (Closure) e Model :: update (Closure) per l'aggancio in eventi di salvataggio Eloquent. Grazie a Phil Sturgeon per avermi finalmente fatto pressione in questo ... :)

22

Aggiungendo un esempio per laravel 4:

class Page extends Eloquent { 

    public static function boot() 
    { 
     parent::boot(); 

     static::creating(function($page) 
     { 
      // do stuff 
     }); 

     static::updating(function($page) 
     { 
      // do stuff 
     }); 
    } 

} 
+2

Ho passato un po 'di tempo a chiedermi perché quanto sopra non funziona nei miei test. C'è una discussione al riguardo qui: https://github.com/laravel/framework/issues/1181. Puoi mettere il binding in global.php per risolvere il problema. –

+1

Suggerisco questa risposta per gli osservatori http://stackoverflow.com/a/24773838/1275911 –

Problemi correlati