微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

输入未更改时观察者不会触发更新事件-Laravel

如何解决输入未更改时观察者不会触发更新事件-Laravel

我正在 Postman 中进行测试,如果我使用新的输入数据点击 sendpostman 按钮,下面的代码可以正常工作。但是如果我第二次点击 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','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');
});

解决方法

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

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

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。