输入未更改时观察者未触发更新事件 - Laravel
Posted
技术标签:
【中文标题】输入未更改时观察者未触发更新事件 - Laravel【英文标题】:Observer not triggering updated event when input not changed - Laravel 【发布时间】:2021-09-24 01:36:25 【问题描述】:我正在 Postman 中进行测试,如果使用新的输入数据单击 postman
的 send
按钮,则以下代码可以正常工作。但是如果我第二次点击邮递员的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');
);
【问题讨论】:
请添加您的路线,并添加您要发布的路线。这些只是两种方法。 @frogeyedman 查看更新后的问题。我也添加了路线 以及您要发布或获取的路线是什么? 我正在使用POST
方法进行更新和GET
方法进行查看
@frogeyedman 你分享了链接,知道如何提出一个好问题。我的问题有什么问题
【参考方案1】:
Controller 中的FileLogs::find($id)
方法会触发 Observer 上的retrieved()
方法。这就是1 file viewed
消息的来源。
您提到多次调用api/file-logs/update/id
端点。第一次,它确实触发了 Observer 上的 updated()
方法。第二次使用完全相同的有效负载调用端点时,它不会触发 Observer 上的updated()
方法。
原因是updated()
仅在模型更新时被调用。由于您第二次发送完全相同的数据,FileLog
模型未更新,因此不会在 Observer 上触发 updated()
。
【讨论】:
那么,这不是错误吗?我不能解决这个问题吗? 这不是错误,这是预期的行为。仅当模型实际更新为新值时。观察者将被触发。您可以在 Observer 中使用saving()
或 saved()
方法而不是 updated()
方法。你也可以使用updating()
。如需更多信息,请查看docs about Eloquent model events。如果你真的想使用updated()
,你必须在你的模型上创建一个额外的列(比如一个计数器)并且每次都简单地更新。但这可能不是你想要的。
在观察者中使用 updating
事件得到相同的结果
在观察者中使用 saving
和 saved
事件添加 2 个日志条目,例如 1 file viewed
和 1 file updated
到 db ,即使为更新提供了新的输入数据
1 file viewed
因find()
方法而被触发。 saving()
和 saved()
事件分别在保存或保存模型时触发,因此插入 1 file updated
。这就是你想要实现的目标吗?以上是关于输入未更改时观察者未触发更新事件 - Laravel的主要内容,如果未能解决你的问题,请参考以下文章