Request:: has() возвращает false, даже если параметр присутствует

URL: http://localhost/?v=

код:

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

Выход: false

Что происходит? Является ли это ошибкой или я что-то делаю неправильно?

Ответ 1

Request::has() проверяет, действительно ли элемент установлен. Пустая строка не учитывается здесь.

Вместо этого вы ищете: Request::exists()!

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

Ответ 2

TL;DR

Обновление до Laravel 5.5 или выше. Они изменили это, так что теперь он работает так, как вы ожидали.

Описание

В руководстве по обновлению Laravel 5.5, мы читаем следующее:

Метод has

Теперь метод $request->has возвращает true, даже если входное значение является пустой строкой или null. Добавлен новый метод $request->filled, который обеспечивает предыдущее поведение метода has.

Метод $request->exists все еще работает, это просто псевдоним для $request->has.

Изучение исходного кода

  • В Laravel 5.4:
    • $request->exists: Определите, содержит ли запрос данный ключ элемента ввода.
    • $request->has: Определите, содержит ли запрос непустое значение для элемента ввода.
  • В Laravel 5.5:
    • $request->exists: Псевдоним для $request->has
    • $request->has: Определите, содержит ли запрос данный ключ элемента ввода.
    • $request->filled: определить, содержит ли запрос непустое значение для элемента ввода.

Если вы нажмете на приведенные выше команды, вы можете проверить исходный код и увидеть, что они буквально просто переименовали exists в has, has в filled, затем с псевдонимом exists на has.

Ответ 3

Как мне это не ошибка, но функция:) В вашем примере v предоставляется, но он пуст.

В код рамки вы найдете следующее:

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

Итак, если указана пустая строка has(), метод вернет false. Это имеет смысл для меня, в большинстве случаев я хочу этого поведения.