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

Posted

技术标签:

【中文标题】输入未更改时观察者未触发更新事件 - Laravel【英文标题】:Observer not triggering updated event when input not changed - Laravel 【发布时间】:2021-09-24 01:36:25 【问题描述】:

我正在 Postman 中进行测试,如果使用新的输入数据单击 postmansend 按钮,则以下代码可以正常工作。但是如果我第二次点击邮递员的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 事件得到相同的结果 在观察者中使用 savingsaved 事件添加 2 个日志条目,例如 1 file viewed1 file updated 到 db ,即使为更新提供了新的输入数据 1 file viewedfind() 方法而被触发。 saving()saved() 事件分别在保存或保存模型时触发,因此插入 1 file updated。这就是你想要实现的目标吗?

以上是关于输入未更改时观察者未触发更新事件 - Laravel的主要内容,如果未能解决你的问题,请参考以下文章

敲除可观察字段未在输入值更改时更新

更新字段时,UITextField“值已更改”未触发

触发更改事件后,Kendo Observable 未更新

输入未触发更改事件

更改时的jQuery文件输入未触发

jQuery更改处理程序未触发[重复]