Laravel 拉雷维尔。如何应用“两个条件”;必需的“如果”;“内部”;FormRequest“;字段看起来像;书籍*页面*颜色“;?

Laravel 拉雷维尔。如何应用“两个条件”;必需的“如果”;“内部”;FormRequest“;字段看起来像;书籍*页面*颜色“;?,laravel,validation,laravel-formrequest,Laravel,Validation,Laravel Formrequest,我有多个验证字段,如下所示: books.*.id books.*.pages.*.color books.*.pages.*.number authors.*.books.*.id authors.*.books.*.name 'books.*.pages.*.color' => [ 'required_if:books.*.id,10', 'required_if:authors.*.books.*.id,20' ], 'books.3.pages.7.color' =

我有多个验证字段,如下所示:

books.*.id
books.*.pages.*.color
books.*.pages.*.number
authors.*.books.*.id
authors.*.books.*.name
'books.*.pages.*.color' => [
   'required_if:books.*.id,10',
   'required_if:authors.*.books.*.id,20'
],
'books.3.pages.7.color' => [
   'required_if:books.3.id,10',
   'required_if:authors.1.books.3.id,20'
],
    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");
                    }
                }
            }
        });
    }
对于一个字段,我需要两个必需的\u if条件(如下所示):

两个必需的_if应同时应用(通过和条件)。如果只需要一个以上的“书籍..页面..颜色”,则不需要

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

books.*.id
books.*.pages.*.color
books.*.pages.*.number
authors.*.books.*.id
authors.*.books.*.name
'books.*.pages.*.color' => [
   'required_if:books.*.id,10',
   'required_if:authors.*.books.*.id,20'
],
'books.3.pages.7.color' => [
   'required_if:books.3.id,10',
   'required_if:authors.1.books.3.id,20'
],
    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");
                    }
                }
            }
        });
    }

如何执行此操作?

如果所需的\u不支持ANDIN,则可以使用,并且可以覆盖GetValidator实例以使用它。但是,此解决方案还需要验证以了解索引,因此我们不能使用有条件添加的规则

在的注释中有一个很酷的解决方案,但是我无法使用上面的一个索引使它与深度嵌套的规则一起工作

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

books.*.id
books.*.pages.*.color
books.*.pages.*.number
authors.*.books.*.id
authors.*.books.*.name
'books.*.pages.*.color' => [
   'required_if:books.*.id,10',
   'required_if:authors.*.books.*.id,20'
],
'books.3.pages.7.color' => [
   'required_if:books.3.id,10',
   'required_if:authors.1.books.3.id,20'
],
    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");
                    }
                }
            }
        });
    }

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

如果所需的\u不支持ANDIN,您可以使用,并且可以覆盖GetValidator实例来使用它。但是,此解决方案还需要验证以了解索引,因此我们不能使用有条件添加的规则

在的注释中有一个很酷的解决方案,但是我无法使用上面的一个索引使它与深度嵌套的规则一起工作

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

books.*.id
books.*.pages.*.color
books.*.pages.*.number
authors.*.books.*.id
authors.*.books.*.name
'books.*.pages.*.color' => [
   'required_if:books.*.id,10',
   'required_if:authors.*.books.*.id,20'
],
'books.3.pages.7.color' => [
   'required_if:books.3.id,10',
   'required_if:authors.1.books.3.id,20'
],
    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");
                    }
                }
            }
        });
    }

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

是的,这几乎是我需要的!但是,是否可以使用“books.*.pages.*.color”来获取检查的当前数组号(数字而不是星号)。我不需要检查所有$input->books当前的“books.*.pages.*.color”。比如说,验证器正在检查“books.3.pages.*.color”。所以,我只需要检查一个值:if($books[3]['id']==20)。如果这是你的情况,我有一个不同的解决方案。也请用这个细节更新你的问题:)更新了问题:“还有一个条件,如果我们在一个循环中检查‘books..pages..color’,比如foreach(),我们的验证器应该使用相同的嵌套数组索引,如下所示:……”嗯,我意识到自定义规则也不能访问索引,所以我们需要在这里进行一些直接的自定义验证。我需要去afk一段时间,但是如果你查看表单请求的validatorAfter()方法,你会发现你可以在那里做任何你想做的事情。我有时为最近的一个问题写了一个索引感知:是的,这几乎是我需要的!但是,是否可以使用“books.*.pages.*.color”来获取检查的当前数组号(数字而不是星号)。我不需要检查所有$input->books当前的“books.*.pages.*.color”。比如说,验证器正在检查“books.3.pages.*.color”。所以,我只需要检查一个值:if($books[3]['id']==20)。如果这是你的情况,我有一个不同的解决方案。也请用这个细节更新你的问题:)更新了问题:“还有一个条件,如果我们在一个循环中检查‘books..pages..color’,比如foreach(),我们的验证器应该使用相同的嵌套数组索引,如下所示:……”嗯,我意识到自定义规则也不能访问索引,所以我们需要在这里进行一些直接的自定义验证。我需要去afk一段时间,但是如果你查看表单请求的validatorAfter()方法,你会发现你可以在那里做任何你想做的事情。我为最近的一个问题写了一个索引感知: