Иногда используется правило проверки Laravel по умолчанию?

Если вы создаете правило проверки в Laravel, но пропускаете |required и просто используете, скажем, правило электронной почты. Что по умолчанию?

Например

$request->validate([
    'email' => 'email'
]);

Равны ли эти правила проверки?

$request->validate([
    'email' => 'sometimes|email'
]);

// vs

$request->validate([
    'email' => 'email'
]);

Извиняюсь, если на этот вопрос уже был дан ответ. Я изо всех сил старался найти похожие вопросы, но, возможно, использовал неправильные слова (не знаю, как сформулировать это для поиска в Google/Stack Overflow).


person vstrand    schedule 25.09.2020    source источник


Ответы (2)


$request->validate([
    'email' => 'email'
]);

Это будет всегда проверять, что ключ email, даже если он пустой, является допустимым форматом email.

$request->validate([
    'email' => 'sometimes|email'
]);

Это только проверит ключ email, если ключ присутствует в $request->all().


Таким образом, разница в том, что с sometimes вы будете проверять его только в том случае, если объект $request содержит его, в то время как в противном случае он всегда будет проверяться по ключу.

Если бы я мог упростить это, я бы сказал, что иногда это означает применять остальные правила проверки только в том случае, если поле отображается в запросе. Представьте, что иногда это похоже на оператор if, который проверяет, присутствует ли поле в запросе/вводе, прежде чем применять какое-либо из правил.

Это может быть утомительно, но вот несколько примеров:

input: []
rules: ['email' => 'sometimes|email']
result: pass, the request is empty so sometimes won't apply any of the rules

input: ['email' => '1']
rules: ['email' => 'sometimes|email']
result: fail, the field is present though invalid email so the email rule fails!

input: []
rules: ['email' => 'email']
result: fail, the request is empty so email is invalid!
person PatricNox    schedule 25.09.2020
comment
Если ответ совпадает с другими вопросами, вы можете продублировать его. stackoverflow.com/a/35839650/9978078 - person Dilip Hirapara; 25.09.2020
comment
Если я отправляю HTTP-запрос без тела (только {}), т. е. без «электронной почты», то правило ['email' => 'email'] остается в силе. Контроллер возвращает 200 OK. Однако с пустым телом, но с правилом, установленным на ['email' => 'required|email'], он возвращает 422, как и ожидалось. Вот почему я сначала подумал, что ['email' => 'email'] и ['email' => 'иногда | электронная почта'] равны, поскольку ответ контроллера — 200 OK. - person vstrand; 25.09.2020

Лично я ни разу не использовал правило sometimes. Согласно документам:

https://laravel.com/docs/7.x/validation#conditionally-adding-rules

вы можете захотеть запустить проверки правильности поля, только если это поле присутствует во входном массиве. Чтобы быстро выполнить это, добавьте правило иногда в свой список правил.

Если я правильно понимаю, это во многом зависит от реализации вашего интерфейса. Если вы используете обычные элементы html <form>, где у вас есть ввод с name="email", он отправит ключ с именем email, как только вы отправите форму.

Поэтому, чтобы НЕ отправлять такой ключ, вы должны удалить его из формы или вручную сделать HTTP-запрос (таким образом, игнорируя любую HTML-форму), чтобы вы могли выбрать свои собственные поля ввода.

person Flame    schedule 25.09.2020