【问题标题】:Request::has() returns false even when parameter is present即使存在参数,Request::has() 也会返回 false
【发布时间】:2015-05-26 22:33:04
【问题描述】:

网址:http://localhost/?v=

代码:

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

输出:false

发生了什么事?这是一个错误还是我做错了什么?

【问题讨论】:

  • 你试过Input::has('v')吗? Input::has() 仅在变量存在并且我相信它具有值时才有效。
  • 是的,我有。结果相同。嗯...在那种情况下,我想我将不得不使用isset($_GET['v'])
  • 自从 Laravel 5.5 has() 可以正常工作。 See my answer.

标签: laravel laravel-5


【解决方案1】:

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

您正在寻找的是:Request::exists()!

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

【讨论】:

  • 这正是我想要的 :) 谢谢。
  • @llukasgeiter.谢谢它帮了我很多
  • 这在 5.5 中改变了。现在has 也执行exists 的功能,has 的功能已移至filled。 See my answer.
  • @totymedli 在这里帮助了我。
【解决方案2】:

tl;博士

升级到 Laravel 5.5 或更高版本。他们改变了这一点,所以现在它可以按照您最初的预期工作。

说明

在Laravel 5.5 upgrade guide 中,我们读到以下内容:

has 方法

$request->has 方法现在将返回 true,即使输入值为空字符串或 null。添加了一个新的$request->filled 方法,它提供了has 方法的先前行为。

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

检查源代码

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

【讨论】:

  • 在 5.5 之前的 laravel 版本中可以安全使用 exists(),因为它使用 Array::has() 确保参数不为空,即 null、空字符串、空数组。 PS:在L5.4上测试
  • 有时即使参数不存在,方法也会返回 true。但按预期填充工作。我不知道为什么没有像填充的那样按预期工作。
【解决方案3】:

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

【讨论】:

    【解决方案4】:

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

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

    【讨论】:

      【解决方案5】:

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

      在framework code 你会发现这个:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-11-30
        • 2021-07-06
        相关资源
        最近更新 更多