Я пытаюсь понять, как работают сессии в Laravel 5 (.4). В одной руке есть два способа их использования, как описано в официальной документации :
Существует два основных способа работы с данными сеанса в Laravel: глобальный помощник сеанса и экземпляр Request.
$request->session()->put('key', 'value');
а также
session(['key' => 'value']);
В документации говорится:
Практически нет разницы между использованием сеанса через экземпляр HTTP-запроса и использованием глобального помощника сеанса.
Но это не объясняет, в чем разница.
С другой стороны, есть «Facade way»:
Session::put('key', 'value');
И недавно я нашел этот вопрос о переполнении стека. Как использовать сессию в контроллере laravel 5.2 . train_fox указал так:
session()->put('key', 'value');
Таким образом, это в общей сложности четыре способа. И я не могу понять, почему или когда пользуюсь тем или иным. Кто-нибудь знает разницу между этими четырьмя?
Кстати, единственный способ получить сеансы для работы с Редисом – это два последних пути.
Заранее благодарю за ваше просвещение.
Давайте сначала рассмотрим Фасад:
Session::put('key', 'value');
Этот фасад вызывает Illuminate\Session\Store::put()
.
Теперь рассмотрим функцию session()
:
function session($key = null, $default = null) { if (is_null($key)) { return app('session'); } if (is_array($key)) { return app('session')->put($key); } // ... }
Читая это, мы можем предположить, что session(['a' => 'b'])
работает аналогично, что session()->put('a', 'b')
(потому что, если это массив, он вызывает put
on the такая же функция).
app('session')
возвращает Illuminate\Session\SessionManager
( https://laravel.com/docs/5.4/facades#facade-class-reference ). Illuminate\Session\SessionManager
имеет функцию __call
которая коротко вызывает драйвер сеанса. Так что это одно и то же поведение.
Теперь разница может быть в функции $request
vs all other (как написано в документах). Согласно исходному коду, он возвращает \Symfony\Component\HttpFoundation\Session\SessionInterface
. SessionInterface
не имеет тех же методов, что и Illuminate\Session\Store
поэтому, возможно, поэтому он отличается.
Хорошо, я сдаюсь. Трудно понять. Я больше не могу помочь тебе, я потерян. Я сохраняю этот пост для истории.