Век живи - век учись. Или случаи когда интуиция подводит.
Пост о моих наблюдениях по объекту реквеста Laravel и небольшие заметки. Итак, я всегда думал, что
request(‘key’)
и
request()->get(‘key’)
это одно и то же, но в процессе разработки MoonShine было замечено странное поведение (на самом деле с объектом реквеста Ларавел такое было часто). Пришлось заглянуть под капот и удивится.
Первый вариант это сбор всего с реквеста и обращение по ключу, вот такой “красивый” код:
return $this->query->all()[$key];
return $this->request->all()[$key];
Второй же вариант еще более красивый, и под капотом мы не дергаем тот же самый метод get, а обращаемся к магическому __get (редко встречаются такие вызовы):
$value = app('request')->__get($key);
Который, в свою очередь, работает через класс Arr и позволяет обращаться к параметрам реквеста через точку (для вложенности). При этом если ничего не найдет, то дополнительно поищет в параметрах роута. Это намного тяжелее и результат может быть непредсказуемым. На самом деле меня и смутило, что мы еще лезем в роут, в объекте реквеста еще есть сессии (не удивился бы, если бы полезли сразу и туда)
public function __get($key)
{
return Arr::get($this->all(), $key, fn () => $this->route($key));
}
На заметку. Есть еще
request()->input(‘key’)
Который также через Arr::get соберет все параметры, но не полезет в роут
Ну и всегда был отдельный метод для получения исключительно параметров с роута
request()->route(‘key’)
Как раз его вызов я и не ожидал, когда дергал request(‘key’).
Тот случай, когда сахар вреден и легко запутаться.
Не перестаю удивляться решениям в реквесте Laravel и все чаще заглядываю под капот, когда речь идет о взаимодействии с Laravel.
В итоге:
request(‘key’) лучше не использовать. Я думаю врядли вам потребуется получать значение отовсюду откуда только можно.
request()->get(‘key’) нормально, но без вложенности через точку.
request()->input(‘parent.key’) наверное, идеально подойдет для подобных манипуляций, плюс вложенность.
request()->route(‘key’) параметр с роута.
>>Click here to continue<<