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");
}
}
}
});
}
Я сделал некоторые предположения о том, что делали ваши правила, если я неправильно истолковал, дайте мне знать, и я обновлю. Надеюсь, это поможет.