如何使用 FormRequests 在 Laravel 中验证之前检查资源是否存在

How to check for resource existence before validation in Laravel with FormRequests

我环顾四周,但无法找到在使用 Laravel 8 FormRequest 类.[=12 验证传入请求之前执行资源存在性检查的方法=]

基本上,我想在例如 PUT/PATCH 请求更新资源时执行以下步骤:

  1. 检查请求的资源是否存在
  2. 检查用户是否有权进行更新
  3. 验证请求的字段
  4. 更新资源
  5. 将响应发回给用户

据我所知,在 FormRequest 中执行步骤 2 和 3 很容易,而步骤 4 和 5 可以在控制器中完成(或者 4 在服务中完成,5 在控制器中完成)。

我缺少的是如何在一开始就执行第 1 步。我已经看到了一些解决方法,例如 How to throw a 404 in Laravel Form Request with custom Rule maybe alongside How to validate Route Parameters in Laravel 5?,但我认为这不是实现我想做的事情的正确方法...

通过控制器中的存在性检查,用户可以首先发出有效请求,即使他正在尝试更新不存在的资源(因为框架会在调用控制器方法之前抛出 ValidationException)这听起来不对。

关于如何在实现存在性检查后“延迟”验证的任何建议?否则,我应该完全放弃使用 FormRequests 吗?

提前致谢!

您要查找的是数据库事务。它将确保只有在一切正常时才执行请求。了解更多信息 https://laravel.com/docs/5.8/database#database-transactions

事实证明,这是 type-hinting 资源分配给控制器时的默认设置。首先是存在性检查,然后是授权,然后才是验证。