2017-03-31 44 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