Проверка строки Laravel для разрешения пустых строк

В 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."
        ]
    }
}

Я ожидаю, что он пройдет проверку, поскольку заголовок представляет собой строку, хотя и пустую. Как должна быть сформулирована проверка, чтобы разрешить пустые строки?

Попробуйте также добавить валидатор present или required.

ka_lin 22.02.2019 16:38

@ka_lin Настоящее и обязательное не описывают это свойство, которое не обязательно должно присутствовать и не требуется.

GluePear 22.02.2019 16:41
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
19
2
24 390
6
Перейти к ответу Данный вопрос помечен как решенный

Ответы 6

Вам понадобится nullable, чтобы разрешить пустую строку

public function rules() 
{
    return [
        'age' => 'integer',
        'title' => 'nullable|string|max:50'
    ];
}

nullable — проверяемое поле может иметь значение null. Это особенно полезно при проверке таких примитивов, как строки и целые числа, которые могут содержать нулевые значения.

ka_lin 22.02.2019 16:38

Это не позволяет использовать пустую строку, это просто игнорирует пустую строку, рассматривая ее как null. Что, если мы хотим перезаписать существующее поле title пустой строкой?

GluePear 22.02.2019 16:40

@GluePear, если вы хотите это сделать, вам также нужно будет отключить \Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsTo‌​Null::class в промежуточном программном обеспечении. Это промежуточное ПО автоматически преобразует пустые строки в null. С точки зрения нормализации базы данных было бы лучше иметь null в качестве значения, а не пустую строку.

George Hanson 22.02.2019 16:51

Подтверждаю, это работает. Если вы оставите это конкретное поле пустым, nullable сделает его пустым. Вот документы.

Pathros 02.07.2020 02:18
Ответ принят как подходящий

Попробуйте проверить, активно ли промежуточное ПО ConvertEmptyStringsToNull, тогда это объясняет такое поведение, см. документы

Спасибо, это полезно. Я не уверен, что удалю это промежуточное ПО, если оно используется где-то еще. Но это объясняет поведение.

GluePear 22.02.2019 16:51

может быть, добавление ограничения min помогло бы?

public function rules() 
{
    return [
        'age' => 'integer',
        'title' => 'string|min:0|max:50'
    ];
}

я постараюсь

public function rules() 
{
    return [
        'age' => 'integer',
        'title' => 'string|sometimes'
    ];
}

Это будет проверять заголовок только тогда, когда он присутствует.

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

PatricNox 26.06.2020 16:33

есть present правило, в котором проверяется наличие ключа, но пусть оно будет пустым.

#present

present The field under validation must be present in the input data but can be empty.

https://laravel.com/docs/5.7/validation#rule-представление

Избегать касается настроек ПО промежуточного слоя.

Вместо этого используйте встроенную функцию Laravel для управления данными перед запуском проверки.

Внутри класса проверки

protected function prepareForValidation()
    {
        if ($this->title == null )
            $this->merge(['title'=>'']);
    }

Другие вопросы по теме