Laravel. Как применить два условия «required_if» внутри «FormRequest», где поля выглядят как «книги * страницы * цвет»? - PullRequest
1 голос
/ 11 июля 2020

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

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 должны применяться одновременно время (с помощью условия И). Если только одно, кроме 'books. .pages. .color', не должно требоваться.

И еще одно условие, Если мы проверяем 'books. .pages. .color 'в цикле, как и foreach (), наш валидатор должен использовать те же индексы вложенных массивов, как этот:

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

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

1 Ответ

0 голосов
/ 11 июля 2020

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");
                    }
                }
            }
        });
    }

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

...