2017-03-22 43 views
2

我正在尝试在应用程序的每个请求上记录数据。如果用户保存特定模型的数据,我试图将原始数据保存在与activity_logs表关联的revisions表中。在中间件中捕获模型事件 - Laravel 5.4

我一直在使用模型事件捕获数据如下尝试:

class BaseModel extends Model 
{ 
    public static function boot() 
    { 
     parent::boot(); 

     static::saving(function($model){ 
      $revision = new Revision; 
      $revision->table_name = $model->getTable(); 
      $revision->row_id = $model->id; 
      $revision->data = json_encode($model->getDirty()); 
      $revision->save(); 

      $log = ActivityLog::find(Session::pull('activity_log_id')); 
      $log->revision_id = $revision->id; 
      $log->save(); 
     }); 
    } 
} 

然而,这似乎中间件进行实例化之前的模型事件被解雇所以虽然修订版本被保存,这是被保存在先前的GET请求中而不是新的PUT请求中。

activity_logs的一个例子如下: Example of activity logs 任何帮助,非常感谢。

编辑:更新包括跟踪中间件代码:

public function handle($request, Closure $next) 
    { 
     // Handle the next response and check tracking cookie 
     if($request->hasCookie('session_tracking')) { 
      $cookie_id = Cookie::get('session_tracking'); 
      $next_request = $next($request); 
     } else { 
      $cookie_id = Uuid::generate()->string; 
      $next_request = $next($request)->withCookie(cookie('session_tracking', $cookie_id)); 
     } 

     // Get user agent data 
     $agent = new Agent(); 
     $exception = $next_request->exception; 

     // Store associated log data 
     $path = $this->storePaths($request); 
     $browser = $this->storeBrowser($agent); 
     $os  = $this->storeOS($agent); 
     $device = $this->storeDevice($agent); 
     $error = $this->storeError($exception); 

     // Store the collated log 
     $activitylog = $this->storeLog($path, $browser, $os, $device, $agent, $request, $cookie_id, $error); 

     Session::put('activity_log_id', $activitylog->id); 

     return $next_request; 
    } 
+0

你可以在'save'方法被调用的地方发布代码吗?想知道模型保存是否在中间件之前被调用,您在会话中设置了活动日志ID值 – Paras

+0

我现在已经更新了我的问题,以包含中间件代码,其中'activity_log_id'放置在会话中 –

+0

在哪个中间件上'handle()'方法? – TheFallen

回答

2

您正在运行的控制器所创建的新activitylog记录之前。

如果移动

  $next_request = $next($request); 

你所创建的日志记录,则新的日志记录将在模型前被创建后保存方法执行。