Request::has() returns false 即使存在参数

Request::has() returns false even when parameter is present

URL: http://localhost/?v=

代码:

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

输出:false

这是怎么回事?这是一个错误还是我做错了什么?

对我而言,这不是错误,而是功能:) 在您的示例中提供了 v,但它是空的。

framework code 你会发现这个:

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

因此,如果提供空字符串 has() 方法将 return false。这对我来说很有意义,在大多数情况下我想要这种行为。

Request::has() 将检查该项目是否实际设置。此处不计算空字符串。

您要查找的是:Request::exists()!

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

tl;博士

升级到 Laravel 5.5 或更高版本。 他们对此进行了更改,因此现在它可以像您最初预期的那样工作了。

说明

Laravel 5.5 upgrade guide中,我们阅读了以下内容:

The has Method

The $request->has method will now return true even if the input value is an empty string or null. A new $request->filled method has been added that provides the previous behavior of the has method.

$request->exists方法仍然有效,只是an alias for $request->has

检查源代码

如果你点击上面的命令,你可以查看源代码并看到它们只是将 exists 重命名为 hashas 重命名为 filled , 然后别名 existshas.

使用Request::filled()因为不像Request::has(),它还会检查参数是否不为空。

你可能想看看这个。因为 $request->has() 方法及其 属性 可以提供对请求源的访问。

可以使用 $request->has('username') 这将检查 <input type="text" name="username" /> 用户名属性是否实际存在或 params/.query 字符串是否在全局请求中实际具有该键。