web-dev-qa-db-fra.com

Request :: has () renvoie false même si le paramètre est présent

URL: http://localhost/?v=

Code:

Route::get('/', ['as' => 'home', function()
{
    dd(Request::has('v'));
}]);

Sortie: false

Que se passe-t-il? Est-ce un bug ou est-ce que je fais quelque chose de mal?

14
Bald

Request::has() vérifiera si l'élément est réellement défini. Une chaîne vide ne compte pas ici.

Ce que vous recherchez à la place est: Request::exists()!

Route::get('/', ['as' => 'home', function()
{
    dd(Request::exists('v'));
}]);
40
lukasgeiter

tl; dr

Mise à niveau vers Laravel 5.5 ou supérieur. Ils ont changé cela pour que maintenant cela fonctionne comme prévu à l'origine.

Explication

Dans le Laravel 5.5 guide de mise à niveau , nous lisons ce qui suit:

La méthode has

La méthode $request->has renverra désormais true même si la valeur d'entrée est une chaîne vide ou null. Une nouvelle méthode $request->filled a été ajoutée. Elle fournit le comportement précédent de la méthode has.

La méthode $request->exists fonctionne toujours, c’est juste un alias pour $request->has .

Examiner le code source

  • Dans Laravel 5.4:
    • $request->exists : Détermine si la demande contient une clé d'élément d'entrée donnée.
    • $request->has : Détermine si la demande contient une valeur non vide pour un élément d'entrée.
  • Dans Laravel 5.5:
    • $request->exists : Alias ​​pour $request->has
    • $request->has : Détermine si la demande contient une clé d'élément d'entrée donnée.
    • $request->filled : Détermine si la demande contient une valeur non vide pour un élément d'entrée.

Si vous cliquez sur les commandes ci-dessus, vous pouvez extraire le code source et constater qu'il est simplement renommé exists en has, has en filled, puis alias exists en has.

24
totymedli

Vous voudrez peut-être vérifier ceci. depuis la méthode $request->has() et sa propriété peuvent offrir l’accès pour demander Origin.

Il est correct d'utiliser $request->has('username'). Cela vérifiera si les attributs <input type="text" name="username" /> du nom d'utilisateur existent réellement ou si la chaîne params/.query a réellement cette clé sur la requête globale.

4
Delino

Quant à moi, ce n'est pas un bug, mais une fonctionnalité :) Dans votre exemple, v est fourni, mais il est vide.

Dans code-cadre vous trouverez ceci:

if ($this->isEmptyString($value)) return false;

Ainsi, si une chaîne vide est fournie, la méthode has() renverra false. Cela a du sens pour moi, dans la plupart des cas, je veux ce comportement.

2
Limon Monte

Utilisez Request::filled() car, contrairement à Request::has(), il vérifie également si le paramètre n'est pas vide.

1
doncadavona