Я не мог найти информацию, связанную с двумя типами методов доступа к сеансу. $request->session()
из экземпляра HTTP-запроса и session()
из помощника сеанса в Laravel 5.3. Есть ли какая-либо разница или какой из них использовать?
Как отправить запрос получения ниже метода контроллера при использовании модуля PHP
public function testMyMethod(Request $request){ $userExist = $request->session()->exists('user_id'); }
Сервисный контейнер является основой архитектуры Laravel. Все сервисы, компоненты и зависимости зарегистрированы там, и вы можете запросить любой из них, когда вам это нужно.
Но Laravel предлагает более одного способа «попросить об этом». У вас есть глобальные вспомогательные функции, у вас есть фасады, у вас есть «правильная», «более чистая» инъекция экземпляра компонента в сигнатуре метода. Я думаю, что большая часть философии Laravel – это чистый, простой, интуитивно понятный API. И в этом случае вы можете отказаться от своих личных предпочтений, чтобы определить, что такое «чистое и легкое», и что бы ни было вашим стилем, по определению, интуитивно понятным для вас.
Я знаю, что в сообществе PHP были горячие дебаты о том, какой метод является «лучшим», фасады были спорными, традиционная инъекция зависимости ООП-пуристы говорят, что единственным правильным способом может быть инъекция объекта с помощью сигнатуры метода контроллера …
В конце концов, любой из этих различных методов просто захватывает объект из одного и того же контейнера-контейнера. Это не имеет разницы в производительности (я уверен, что два вызова функции косвенности не повлияют на вашу производительность) или иным образом. Итак, используйте то, что лучше подходит вашему стилю. Я лично делаю «правильную» инъекцию в любом случае, если у меня типичный контроллер, но, возможно, я использую глобальный помощник, если он делает более чистым, более читаемым кодом в его контексте.
<?php namespace App\Http\Controllers; use Illuminate\Contracts\Session\Session; use Facades\Illuminate\Contracts\Session\Session as SessionRealTimeFacade; use Illuminate\Http\Request; use Illuminate\Support\Facades\Input; use Illuminate\Support\Facades\Request as RequestFacade; use Illuminate\Support\Facades\Session as SessionFacade; use PHPUnit\Framework\Assert; class TestController extends Controller { public function sessionTest(Request $request, Session $session) { $options = [ $request->session()->get('_token'), session()->get('_token'), session('_token'), $session->get('_token'), SessionFacade::get('_token'), SessionRealTimeFacade::get('_token'), app('session')->get('_token'), ]; array_reduce( $options, function ($one, $other) { Assert::assertEquals($one, $other); return $other; }, array_shift($options) ); return 'All tests passed!'; } }
И, кстати, как вы видите, у вас есть не более двух вариантов 🙂
Конечно, это не относится только к сеансам, то же самое касается получения данных запроса, получения соединения с БД и т. Д.
(Кроме того, я думаю, что у вас нет фасадов в режиме реального времени в 5.3)
$ request-> session () и session () – это то же самое.
Существует два основных способа работы с данными сеанса в Laravel: глобальная функция в помощнике session () и через экземпляр $ request.
вы можете использовать его так
public function testMyMethod(Request $request){ //$userExist = $request->session()->exists('user_id'); $userExist = $request->session()->has('user_id'); }
Согласно Laravel Docs – https://laravel.com/docs/5.3/session, « существует небольшая практическая разница между использованием сеанса через экземпляр HTTP-запроса и использованием глобального помощника сеанса», и оба они могут быть проверены.
->assertSessionHas($key, $value = null);
В своей книге (стр. 320-) Мэтт рассказывает о различных способах доступа к информации о сеансе:
Использование фасада Session
session()->get('user_id');
Использование метода session()
для любого объекта Illuminate Request
Route::get('dashboard', function(Request $request) { $request->session()->get('user_id'); });
Внедрить экземпляр Illuminate\Session\Store
Route::get('dashboard', function(Illuminate\Session\Store $session) { return $session->get('user_id'); });
Использование глобального помощника session()
$value = session()->get('key); $value = session('key);
Его последний комментарий: если вы новичок в Laravel и не знаете, что использовать, я бы рекомендовал использовать глобальный помощник .
Поэтому я не буду беспокоиться о различиях и просто идти с тем, что «чувствует себя хорошо» для вас. Если у вас нет предпочтений в любом случае, пойдите с рекомендацией Мэтта Штаффера.
На самом деле родной PHP-сеанс – это готовое решение по сравнению с лучшей реализацией от Laravel и Symfony, которые задумались над этим. Прочтите объяснение в записи конфигурации конфигурации Symfony Session, и вы поймете, что я думаю. Так что есть разница, но в том, как это мыслится и реализуется. С точки зрения производительности я думаю, что их немного. Я позволю вам сделать ваши выводы. Еще одна запись, которая помогает в руководстве PHP
В конечном счете, как обычно вы используете эти два варианта, нет никакой практической разницы между $request->session()
и session()
. Однако они технически не возвращают одни и те же объекты.
session()
вернет SessionManager
. $request->session()
вернет сеанс Store
.
Store
фактически является объектом, который содержит данные сеанса.
SessionManager
– это объект, который управляет доступным сеансом Store
s. Большинство приложений будут использовать только один хранилище сеансов (по умолчанию).
Причина, по которой они, похоже, действуют как один и тот же объект, заключается в том, что при вызове метода в SessionManager
, который не существует, он пересылает этот метод в Store
по умолчанию.
Итак, в вашем примере вы используете метод exists()
. Этот метод не существует в SessionManager
. Итак, если вы должны были вызвать session()->exists('user_id')
, он переадресовал бы этот вызов вниз в Store
сеансов по умолчанию, и это было бы эквивалентно вызову $request->session()->exists('user_id')
.
Можно утверждать, что непосредственное использование $request->session()
более подходит при попытке доступа к данным сеанса, поскольку это то, что возвращается, и не требует вызова дополнительной функции пересылки. Тем не менее, вам решать взвешивать плюсы и минусы, чтобы определить, какой метод использовать.