【问题标题】:How to stop validating a field if the dependant field is invalid? - Laravel如果依赖字段无效,如何停止验证字段? - 拉拉维尔
【发布时间】:2021-03-11 08:43:26
【问题描述】:

我正在尝试根据另一个字段的有效性验证一个字段,但似乎找不到答案。要么我在搜索方面太笨,要么很明显,但我找不到令人满意的答案,所以在这里问。

我有一个创建unit 的表单。 unit 属于 blockblock 属于 class。在我的表单中,我有字段可以选择class,然后是classblock。我想要实现的是验证block,我的规则如下所示。

"block_id" => 'required|integer|min:1|exists:blocks,id,class_id,'.$request->input('class_id'),

class_id 正在像这样在此规则之前进行验证

"class_id" => 'required|integer|min:1|exists:classes,id',

如果class_id 无效,我想要实现的是停止验证block_id

如果class_id 无效,我也可以完全停止验证,因为我已经从前端验证字段。这是额外的安全层。所以我不关心用户体验(因为普通用户不会发布无效数据)。

我怎样才能做到这一点?

我的第一个猜测是先验证class_id

$request->validate([
    "class_id" => 'required|integer|min:1|exists:classes,id'
]);

然后执行剩余的验证规则。但是我将不得不两次验证请求(不知道这是否重要)。

有没有类似$request->validate($rules, halt on first failure = true) 之类的简单解决方案?我的直觉说应该有,但我找不到。

提前致谢:)

PS:几周前我确实问过这个问题,但没有得到回应,所以重新发布,看看这里是否真的有答案

【问题讨论】:

  • 您可能有兴趣探索通过验证后挂钩laravel.com/docs/8.x/validation#after-validation-hook 和/或有条件地添加规则laravel.com/docs/8.x/validation#conditionally-adding-rules 实现您想要的可能性
  • “从前端验证字段。这是额外的安全层”永远不要仅仅依赖前端验证。在服务器上进行验证是必须作为保护数据和应用程序的良好做法。前端验证必须主要用于更好的用户体验和节省网络请求
  • 是的,我实际上是在寻找验证后挂钩的类似行为,但实际上并非如此。问题是我现在在两个级别上进行两次验证,就像在验证后进行验证一样,我感兴趣的是一种基于@的状态(如有效或无效;而不是值 - 如 1 或 2)指定条件的方法987654341@ 所以条件验证不是我想要的
  • @Donkarnash 我不依赖前端验证,我提到的事实是因为每当我搜索我的这个特殊用例时 - 我都会得到类似“它是一个糟糕的用户体验只发送一个验证结果,您必须一次验证所有内容并发送所有结果”我的行暗示我已经照顾好用户体验,因此,只发送一个结果根本不会影响普通用户。

标签: laravel laravel-validation


【解决方案1】:

您要查找的规则称为bail

在第一次验证失败后停止运行验证规则。

【讨论】:

  • 但是有一个问题,bail 规则将仅适用于该字段,例如:如果class_id 无效,则保释规则将停止对class_id 的进一步验证,但@987654326 @ 仍将被验证,无效的 class_id 将被传递给 block_idexist 规则,假设在 block_id 上已满足所有其他规则。
猜你喜欢
  • 2017-09-21
  • 1970-01-01
  • 1970-01-01
  • 2019-06-29
  • 2020-05-11
  • 2016-05-27
  • 2011-04-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多