【问题标题】:How to check for resource existence before validation in Laravel with FormRequests如何在 Laravel 中使用 FormRequests 进行验证之前检查资源是否存在
【发布时间】:2021-11-13 05:14:17
【问题描述】:

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

基本上,例如,当一个 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 可能与 How to validate Route Parameters in Laravel 5? 并列,但我认为这不是实现我想做的事情的正确方法......

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

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

提前致谢!

【问题讨论】:

    标签: php laravel laravel-8 laravel-formrequest


    【解决方案1】:

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

    【讨论】:

    • 实际上我在验证通过后在控制器中使用 firstOrFail 方法没有问题......并在处理程序中抛出 404。我要强调的一点是,用户首先要发出有效的请求,即使他正在尝试更新不存在的资源
    • 相同但顺序不同。您可以做的是尝试在控制器中获取该资源,如果返回为 null,则请求失败,无需继续执行步骤 2
    • 同意,但这意味着我不应该使用 FormRequest 类,因为如果参数无效,那么控制器永远不会被调用,因为之前抛出了 ValidationException
    【解决方案2】:

    事实证明,这是向控制器类型提示资源时的默认设置。首先是存在性检查,然后是授权,然后才是验证。

    【讨论】:

      猜你喜欢
      • 2021-06-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-10
      • 2013-07-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多