Почему проверка laravel не работает правильно при проверке пустой строки?

Кратко:

У меня есть проверочное значение запроса для пустой строки.

Код:

if(isset($request->name)) {
    $this->validate($request, [
        'name' => [
            function ($attribute, $value, $fail) {
                if (mb_strlen(preg_replace('/\s/', '', $value)) == 0) {
                    $fail($attribute.' is can't be empty.');
                }
            }
        ]
    ]);
    $user->name = $request->name;
    $user->save(); 
}

Также устал от правила кутома.

Код правила:

public function passes($attribute, $value)
{
    $result = preg_replace('/\s/', '', $value);
    return mb_strlen($result) == 0 ? false : true;
}

/**
 * Get the validation error message.
 *
 * @return string
 */
public function message()
{
    return "Attribute value can't be empty string.";
}

Код проверки правила:

if(isset($request->name)) {
    $this->validate($request, [
        'name' => [
            new IsEmptyString
        ]
    ]);
    $user->name= $request->name;
    $user->save(); 
}

Вопрос:

Где есть ошибки? Почему laravel не отправляет сообщение об ошибке проверки, когда я проверяю значение запроса на пустую строку?

Спасибо!


person Andreas Hunter    schedule 25.10.2018    source источник
comment
Конечно, проверка не работает для пустой строки. проверка - это даже не вызов пустой строки, потому что вы поместили ее в условие if.   -  person Tharaka Dilshan    schedule 25.10.2018
comment
Это хорошо понимает @Tharaka Dilshan, но что, если я проверю каждое поле отдельно только с условиями? Как тогда проводить валидацию? В моем случае пустая строка также не записывается в базу данных, но я не могу уведомить пользователя о том, что он ввел пустое поле.   -  person Andreas Hunter    schedule 25.10.2018
comment
В моем случае другие типы проверки внутри условия работают, только когда пустая строка не работает.   -  person Andreas Hunter    schedule 25.10.2018
comment
Да, это потому, что вы поместили функцию проверки в if(isset($request->name)). разве вы не понимаете, что если name пусто, функция проверки даже не вызывается.   -  person Tharaka Dilshan    schedule 25.10.2018
comment
Я понимаю тебя, @Tharaka Dilshan. Но как тогда я могу сказать пользователю, что он ввел пустую строку?   -  person Andreas Hunter    schedule 25.10.2018
comment
сделайте это при валидации. пример 'name' => 'required'   -  person Tharaka Dilshan    schedule 25.10.2018


Ответы (2)


В вашей ситуации вы должны изменить свое состояние на:

if(array_key_exists('name', $request->all())) {

}

Когда вы проверяете isset($request->name), и это условие возвращается, возвращается false, а код проверки даже не запускается и для того факта, что условия вернули false.

Обычно ваш рабочий код выглядит так:

if(array_key_exists('name', $request->all())) {
    $this->validate($request, [
        'name' => [
            'required',
            function ($attribute, $value, $fail) {
                if (mb_strlen(preg_replace('/\s/', '', $value)) == 0) {
                    $fail($attribute." is can't be empty.");
                }
            }
        ]
    ]);

    $user->name = $request->name;
    $user->save();  
}
person Felix Cruz    schedule 25.10.2018
comment
Спасибо, @Felix Cruz, ваш код работает в условиях - person Andreas Hunter; 25.10.2018

Удалите условие if(). а затем добавьте к проверке правило required.

$this->validate($request, [
    'name' => ['required',
        function ($attribute, $value, $fail) {
            if (mb_strlen(preg_replace('/\s/', '', $value)) == 0) {
                $fail($attribute.' is can't be empty.');
            }
        }
    ]
]);
$user->name = $request->name;
$user->save(); 
person Tharaka Dilshan    schedule 25.10.2018