Laravel 6 проверка массива формы - PullRequest
0 голосов
/ 18 января 2020

У меня есть форма, в которой пользователь может добавить столько контактов, сколько ему хотелось бы. Но я застреваю на валидации для этого. Я использую старый способ проверки форм, используя метод $request->validate.

Моя форма (соответствующая часть):

<div class="row">
    <div class="col">
        {!! Form::text('contact_name[]', __('site.contact.name'))->placeholder(__('site.contact.name'))->help('<a href="#add-contact" id="add-contact">+ ' . __('site.contact.add_person') . '</a>') !!}
    </div>
    <div class="col">
        {!! Form::text('contact_email[]', __('site.contact.email'))->placeholder(__('site.contact.email')) !!}
    </div>
    <div class="col">
        {!! Form::text('contact_phone[]', __('site.contact.phone'))->placeholder(__('site.contact.phone')) !!}
    </div>
</div>

И моя проверка в хранилище CRUD Метод:

$request->validate([
    'contact_name.*' => 'required|max:255',
    'contact_email.*' => 'required|email|max:255',
    'contact_phone.*' => 'required|max:255',
]);

Это всегда приводит к проходу, в то время как на входе ничего нет. Когда я попробую следующее; это всегда терпит неудачу.

$request->validate([
    'contact_name[]' => 'required|max:255',
    'contact_email[]' => 'required|email|max:255',
    'contact_phone[]' => 'required|max:255',
]);

Согласно документации, подстановочный путь - это тот путь, которым должен быть. Любые идеи о том, как заставить это работать?

С уважением, Нильс

- РЕДАКТИРОВАТЬ 1 -

Мои данные запроса формы выглядят так (включены только соответствующие переменные)

"_token" => "IbYI2FYivl30YJfw8hBHti9bsaBUdkG2T76HZOIN"
"contact_name" => array:1 [▼
    0 => "abc"
]
"contact_email" => array:1 [▼
    0 => "abc"
]
"contact_phone" => array:1 [▼
    0 => "abc"
]

Ответы [ 2 ]

0 голосов
/ 18 января 2020

(*) проверяет значения в массиве, а не фактический массив. Если вы добавите подстановочные правила, вы получите родительский ключ, который всегда проверяется. Таким образом, вы также должны добавить проверку массива для каждого поля:

'field' => 'array|required'

0 голосов
/ 18 января 2020

Измените свою проверку следующим образом

$request->validate([
    'contact_name'   => "required|array",
    'contact_name.*' => 'required|max:255',
    'contact_email'   => "required|array",
    'contact_email.*' => 'required|email|max:255',
    'contact_phone'   => "required|array",
    'contact_phone.*' => 'required|max:255',
]);

В приведенной выше проверке:

"имя_контакта" должно быть массивом. Необходимо указать значения в массиве «имя_контакта» длиной не менее 255 символов.

или

$request->validate([
    '*.contact_name' => 'required|max:255',
    '*.contact_email' => 'required|email|max:255',
    '*.contact_phone' => 'required|max:255',
]);
...