Laravel. Как применить два условия "required_if" внутри "FormRequest", где поля выглядят как "книги * страницы * цвет"?

У меня есть несколько проверенных полей, например:

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'
],

Как я могу это сделать?

1 ответ

Required_if не поддерживает AND, вместо этого вы можете использовать условно добавленные правила и можете переопределить свой 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");
                    }
                }
            }
        });
    }

Я сделал некоторые предположения о том, что делали ваши правила, если я неправильно истолковал, дайте мне знать, и я обновлю. Надеюсь, это поможет.

Другие вопросы по тегам