首页 > 解决方案 > 输入未更改时观察者未触发更新事件 - Laravel

问题描述

我正在 Postman 中进行测试,如果单击带有新输入数据的send按钮,则以下代码可以正常工作。postman但是,如果我send第二次单击邮递员的按钮而不更改任何输入数据,它会创建一个日志条目1 file viewed而不是1 file inserted. 我的代码有什么问题?

控制器

public function update(Request $request,$id){  
        
        $validator = Validator::make(
            $request->all(),
            [
                
                'orderId'    => 'required|integer',
                'fileId'    => 'required|integer',
                'status'    => 'required|string'
            ]
        );

        if ($validator->fails()) {
            return response()->json($validator->errors(), 400);
        }

        $data=tap(FileLogs::find($id))->update(['orderId'=>$request->orderId,'fileId'=>$request->fileId,'status'=>$request->status]);
       
        if($data){
            return response()->json(['status'=>'success','StatusCode'=> 200,'message'=>'Successfully Updated','data'=>$data]);
           
        }
        else{
            return response()->json(['status'=>'Failed','message'=>'Update Failed'],400);
        }
    }
   
  public function view($id){ 
    
    
        $data = FileLogs::where('id',$id)->get(['orderId','fileId','status']);
        if(count($data)<1){
            return response()->json(['status'=>'Failed','message'=>'Failed to Fetch Data'],400);
        }
        else{
                return response()->json(['status'=>'success','StatusCode'=> 200,'message'=>'Successfully Fetched Data','data'=>$data]);
        }
               
}

观察者

public function updated(FileLogs $fileLogs)
    {
        FilesChangeLogs::create([
                'fileId' => $fileLogs->fileId,
                'logDetails' => '1 file updated',
                'modifiedBy' => Auth::user()->id
            ]);      
    }

  public function retrieved(FileLogs $fileLogs)
{
    FilesChangeLogs::create([
        'fileId' => $fileLogs->fileId,
        'logDetails' => '1 file viewed',
        'modifiedBy' => Auth::user()->id
    ]);
}

路线

Route::group([
    'namespace' => 'App\Http\Controllers',
    'prefix' => 'file-logs',
], function () {
    Route::get('read/{id}', 'FileLogController@view');
    Route::post('update/{id}', 'FileLogController@update');
});

标签: laravelpostgresqleloquentlaravel-8observer-pattern

解决方案


FileLogs::find($id)Controller 中的方法触发Observerretrieved()上的方法。这就是1 file viewed消息的来源。

您提到api/file-logs/update/{id}多次调用端点。第一次,它确实触发updated()了 Observer 上的方法。第二次使用完全相同的 payload调用端点时,它不会触发updated()Observer 上的方法。

这样做的原因updated()只有在模型更新时才会调用它。由于您第二次发送完全相同的数据,因此FileLog模型未更新,因此不会updated()在 Observer 上触发。


推荐阅读