laravel - 输入未更改时观察者未触发更新事件 - 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');
});
解决方案
FileLogs::find($id)
Controller 中的方法触发Observerretrieved()
上的方法。这就是1 file viewed
消息的来源。
您提到api/file-logs/update/{id}
多次调用端点。第一次,它确实触发updated()
了 Observer 上的方法。第二次使用完全相同的 payload调用端点时,它不会触发updated()
Observer 上的方法。
这样做的原因updated()
是只有在模型更新时才会调用它。由于您第二次发送完全相同的数据,因此FileLog
模型未更新,因此不会updated()
在 Observer 上触发。
推荐阅读
- python - 发送指定频道/Python Discord 的消息
- php - Spinner 不显示项目 [android, mysql, php, json]
- docker - Docker - ASP.NET Core 和 SQL Server 脚本
- java - 如何在 IBM java 1.6 中启用 TLS 1.2?
- gradle - 如何在 Gradle Kotlin DSL 中使用来自 gradle.properties 的插件版本?
- javascript - 为什么在这段代码中的 if 语句之后没有运行 java 脚本循环?
- visual-studio-2008 - 在 Azure 云上部署 Visual Studio 2008 Web 应用程序的过程是什么?
- python - concat 和 sum 多索引 pandas 系列
- android - 清除exoplayer的缓存
- java - 如何使用普通 For 循环打印动态数组