2017-03-31 71 views
0

我試圖提供一種方法來跟蹤用戶對我的應用程序中的備註部分的模型進行更改。例如。約翰去修改2個字段,將會創建一個音符,說約翰已將'我的標題1'改爲title,''我的標題2'和content從'Lipsum'改爲'Lipsum2'。嘗試掛鉤到具有特徵的模型「更新」事件

這是一個特點,我創建:

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

而且我使用的特質成功地在我的模型。但是,我不確定如何捕獲更改的內容,或者它們是否正確工作。

在我的控制,我有:

$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); 

我之前和之後$site->update($data);嘗試dd($site->changes),但它只是返回null

我在做什麼錯?

回答

1

你需要改變你的特質的啓動方法爲bootTrackChanges()。要啓動特質,您需要按照boot{TraitName}的命名模式進行啓動。然後,你需要在你的特點來改變你的$this調用$model這樣的變化得到保存的模式,使你的特點應該是這樣的:

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

另外一點需要注意的是,如果你在已定義的引導方法您模型確保你調用父啓動方法,否則你的特徵的啓動方法將不會被調用,你的監聽器將不會被註冊。由於忘記調用父方法,我在這之前花了數小時。在您的模型中定義啓動方法並不是必需的,但如果您確實需要調用父代:

class MyModel extends Model 
{ 
    use TrackChanges; 

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

     parent::boot(); 
    } 
} 
+0

謝謝!這完美的作品! – Mark