В Laravel 5.7 я использую проверку формы запроса:
public function rules()
{
return [
'age' => 'integer',
'title' => 'string|max:50'
];
}
Если я отправлю запрос в свой API с этой полезной нагрузкой:
{
"age": 24,
"title": ""
}
Laravel возвращает ошибку:
{
"message": "The given data was invalid.",
"errors": {
"title": [
"The title must be a string."
]
}
}
Я ожидаю, что он пройдет проверку, поскольку заголовок представляет собой строку, хотя и пустую. Как должна быть сформулирована проверка, чтобы разрешить пустые строки?
@ka_lin Настоящее и обязательное не описывают это свойство, которое не обязательно должно присутствовать и не требуется.






Вам понадобится nullable, чтобы разрешить пустую строку
public function rules()
{
return [
'age' => 'integer',
'title' => 'nullable|string|max:50'
];
}
nullable — проверяемое поле может иметь значение null. Это особенно полезно при проверке таких примитивов, как строки и целые числа, которые могут содержать нулевые значения.
Это не позволяет использовать пустую строку, это просто игнорирует пустую строку, рассматривая ее как null. Что, если мы хотим перезаписать существующее поле title пустой строкой?
@GluePear, если вы хотите это сделать, вам также нужно будет отключить \Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull::class в промежуточном программном обеспечении. Это промежуточное ПО автоматически преобразует пустые строки в null. С точки зрения нормализации базы данных было бы лучше иметь null в качестве значения, а не пустую строку.
Подтверждаю, это работает. Если вы оставите это конкретное поле пустым, nullable сделает его пустым. Вот документы.
Попробуйте проверить, активно ли промежуточное ПО ConvertEmptyStringsToNull, тогда это объясняет такое поведение, см. документы
Спасибо, это полезно. Я не уверен, что удалю это промежуточное ПО, если оно используется где-то еще. Но это объясняет поведение.
может быть, добавление ограничения min помогло бы?
public function rules()
{
return [
'age' => 'integer',
'title' => 'string|min:0|max:50'
];
}
я постараюсь
public function rules()
{
return [
'age' => 'integer',
'title' => 'string|sometimes'
];
}
Это будет проверять заголовок только тогда, когда он присутствует.
Не решает проблему, когда вы хотите, чтобы она всегда присутствовала, хотя и может быть пустой.
есть present правило, в котором проверяется наличие ключа, но пусть оно будет пустым.
#present
present The field under validation must be present in the input data but can be empty.
Избегать касается настроек ПО промежуточного слоя.
Вместо этого используйте встроенную функцию Laravel для управления данными перед запуском проверки.
Внутри класса проверки
protected function prepareForValidation()
{
if ($this->title == null )
$this->merge(['title'=>'']);
}
Попробуйте также добавить валидатор
presentилиrequired.