如何解决输入未更改时观察者不会触发更新事件-Laravel
我正在 Postman 中进行测试,如果我使用新的输入数据点击 send
的 postman
按钮,下面的代码可以正常工作。但是如果我第二次点击 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 举报,一经查实,本站将立刻删除。