2017-03-31 1 views
0

J'essaie de fournir un moyen de suivre quand un utilisateur apporte une modification à un modèle pour une section de notes dans mon application. Par exemple. John va et modifie 2 champs, une note serait créée disant que John a changé title de 'Mon titre 1' à 'Mon titre 2' et content de 'Lipsum' à 'Lipsum2'.Essayer de se brancher sur l'événement Model 'update' avec un trait

est ici un trait que j'ai créé:

<?php 

namespace App\Traits; 

use Illuminate\Database\Eloquent\Model; 

trait TrackChanges 
{ 
    public $changes; 

    public static function bootChangesTrait() 
    { 
     static::updating(function($model) 
     { 
      $this->changes = []; 

      foreach($model->getDirty() as $key => $value) 
      { 
       $original = $model->getOriginal($key); 

       $this->changes[$key] = [ 
        'old' => $original, 
        'new' => $value, 
       ]; 
      } 
     }); 
    } 
} 

Et je me sers de ce trait avec succès sur mon modèle. Cependant, je ne suis pas sûr comment capturer le contenu des changements, ou s'ils fonctionnent même correctement.

Dans mon contrôleur j'ai:

$site = Site::findOrFail($id); 

// Catch and cast the is_active checkbox if it's been unselected 
if (! $request->exists('is_active')) 
{ 
    $request->request->add([ 'is_active' => 0 ]); 
} 

// // Get rid of the CSRF field & method 
$data = $request->except([ '_token', '_method' ]); 

$site->update($data); 

J'ai essayé dd($site->changes) avant et après $site->update($data); mais il retourne juste null.

Qu'est-ce que je fais mal?

Répondre

1

Vous devez changer votre méthode de démarrage dans votre trait à bootTrackChanges(). Pour démarrer les traits, vous devez suivre le modèle de dénomination boot{TraitName} pour votre méthode de démarrage. Ensuite, vous devez changer vos $this appels dans votre trait à $model de sorte que le changement s'enregistré sur le modèle que votre trait devrait ressembler à ceci:

<?php 

namespace App\Traits; 

use Illuminate\Database\Eloquent\Model; 

trait TrackChanges 
{ 
    public $changes; 

    public static function bootTrackChanges() 
    { 
     static::updating(function($model) 
     { 
      $changes = []; 

      foreach($model->getDirty() as $key => $value) 
      { 
       $original = $model->getOriginal($key); 

       $changes[$key] = [ 
        'old' => $original, 
        'new' => $value, 
       ]; 
      } 

      $model->changes = $changes; 
     }); 
    } 
} 

Une autre chose à noter est que si vous avez défini une méthode de démarrage dans votre modèle assurez-vous que vous appelez la méthode de démarrage parent aussi bien sinon les méthodes de démarrage de votre trait ne seront pas appelées et votre écouteur ne sera pas enregistré .. J'ai passé des heures et des heures sur celui-ci avant d'oublier la méthode parent. Dans votre modèle de définir une méthode de démarrage n'est pas nécessaire, mais si vous avez appelé le parent comme:

class MyModel extends Model 
{ 
    use TrackChanges; 

    protected static function boot() 
    { 
     // Your boot logic here 

     parent::boot(); 
    } 
} 
+0

Merci! Cela fonctionne parfaitement! – Mark