Как работают сеансы в Laravel 5

Я пытаюсь понять, как работают сессии в 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 поэтому, возможно, поэтому он отличается.

Хорошо, я сдаюсь. Трудно понять. Я больше не могу помочь тебе, я потерян. Я сохраняю этот пост для истории.