【发布时间】:2021-03-11 08:43:26
【问题描述】:
我正在尝试根据另一个字段的有效性验证一个字段,但似乎找不到答案。要么我在搜索方面太笨,要么很明显,但我找不到令人满意的答案,所以在这里问。
我有一个创建unit 的表单。 unit 属于 block,block 属于 class。在我的表单中,我有字段可以选择class,然后是class 的block。我想要实现的是验证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