2

我有多个这样的经过验证的字段:

books.*.id
books.*.pages.*.color
books.*.pages.*.number
authors.*.books.*.id
authors.*.books.*.name

我需要一个字段的两个 required_if 条件(像这样):

'books.*.pages.*.color' => [
   'required_if:books.*.id,10',
   'required_if:authors.*.books.*.id,20'
],

两个 required_if 应该同时应用(通过 AND 条件)。如果只有一本比'书。.pages。.color' 不应该是必需的。

还有一个条件,如果我们正在检查“书籍”。.pages。.color' 在一个循环中,就像 foreach() 我们的验证器应该使用相同的嵌套数组索引,如下所示:

'books.3.pages.7.color' => [
   'required_if:books.3.id,10',
   'required_if:authors.1.books.3.id,20'
],

我怎样才能做到这一点?

4

1 回答 1

0

required_if 不支持 ANDing,相反,您可以使用有条件添加的规则,并且您可以覆盖您的 getValidatorInstance 以使用它。但是,这个解决方案还需要验证才能知道索引,所以我们不能使用有条件添加的规则。

索引感知条件添加规则的评论中有一个很酷的解决方案,但是我无法使用上层索引之一让它与深度嵌套的规则一起使用。

对于高度自定义的验证,我个人使用 withValidator 和 validatorAfter 方法。您拥有对数据的完全访问权限,并且可以使用您想要的任何消息和密钥以任何您想要的方式验证它。你可以像这样使用它:

    public function withValidator(Validator $validator)
    {
        $validator->after(function (Validator $validator) {
            $authors = $this->input('authors');

            foreach ($this->input('books') as $idx => $book) {
                if ($book['id'] !== 10) {
                    continue;
                }

                $authorId = $book['author_id'];
                if ($authors[$authorId]['books'][$idx]['id'] !== 20) {
                    continue;
                }

                foreach ($book['pages'] as $num => $page) {
                    if (!isset($page['color']) || empty($page['color'])) {
                        $validator->errors()->add("books.$idx.pages.$num.color", "Whatever error message you want here");
                    }
                }
            }
        });
    }

我对你的规则做了一些假设,如果我误解了,请告诉我,我会更新。希望有帮助。

于 2020-07-11T10:58:01.450 回答