Параметр с пустым значением запускает проверку (! Isset) в Laravel

Вот мой сценарий:

if (!isset($request->security_token)) 
{ 
    // Provide security token
    $error = TRUE;
    $err_message[] = Lang::get('caption_validation_error.ser_valid_security_token.value');
    $err_validation[] = Lang::get('caption_validation_error.ser_valid_security_token.value').' [security_token]';
}

Это означает, что если параметр не "отправлен", то проверка запускается. Однако, если передается параметр с "пустым" значением, он не должен запускать проверку.

Однако, когда я нажимаю на API через приложение POSTMAN, security_token с пустым значением входит в проверку! Isset.

Что я делаю неправильно?

1 ответ

Это не так очевидно, почему это так, потому что это кажется довольно странным на первый взгляд. Однако, если вы знаете немного больше о Laravel, и вы посмотрите на app/Http/Kernel.php файл, который вы увидите там:

\Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull::class, 

который, как вы можете узнать из имени, преобразует пустые строки в ноль. Так что в вашем случае, когда вы отправляете пустой параметр, он рассматривается как null так !isset($null) будет правдой.

Итак, у вас есть 2 варианта:

  1. удалите это промежуточное программное обеспечение из массива - однако это повлияет на все приложение, поэтому это может быть не лучшим способом, если вы не уверены в этом
  2. Предполагая, что вы хотите запустить эту проверку, только если параметр вообще не отправляется вместо

    if (!isset($request->security_token))  
    

    Вы можете использовать, например,

    if (!$request->has('security_token'))
    

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

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