网址:http://localhost/?v=
代码:
Route::get('/', ['as' => 'home', function()
{
dd(Request::has('v'));
}]);
输出:false
发生了什么事?这是一个错误还是我做错了什么?
答案 0 :(得分:46)
Request::has()
将检查项目是否实际设置。空字符串在这里不算数。
您要找的是:Request::exists()
!
Route::get('/', ['as' => 'home', function()
{
dd(Request::exists('v'));
}]);
答案 1 :(得分:29)
升级到Laravel 5.5或更高版本。他们改变了这一点,现在它可以按照您的预期工作。
在Laravel 5.5 upgrade guide中,我们阅读以下内容:
has
方法即使输入值为空字符串或
$request->has
,true
方法现在也会返回null
。添加了一个新的$request->filled
方法,该方法提供了has
方法的先前行为。
$request->exists
方法仍有效,只有an alias for $request->has
。
$request->exists
:确定请求是否包含给定的输入项密钥。$request->has
:确定请求是否包含输入项的非空值。$request->exists
:$request->has
$request->has
:确定请求是否包含给定的输入项密钥。$request->filled
:确定请求是否包含输入项的非空值。如果您点击上面的命令,可以查看源代码,看看他们刚刚将exists
重命名为has
,has
改为filled
,然后别名exists
到has
。
答案 2 :(得分:5)
您可能想检查一下。因为$request->has()
方法和it属性可以提供对请求来源的访问。
可以使用$request->has('username')
,这将检查<input type="text" name="username" />
用户名属性是否确实存在,或者params / .query字符串是否在全局请求中实际具有该键。
答案 3 :(得分:2)
至于我,它不是一个错误,而是功能:)在您的示例v
中提供,但它是空的。
在framework code中,您会发现:
if ($this->isEmptyString($value)) return false;
因此,如果提供空字符串,has()
方法将返回false
。这对我来说很有意义,在大多数情况下我都想要这种行为。
答案 4 :(得分:1)
使用Request::filled()
是因为与Request::has()
不同,它还会检查参数是否为空。