Почему в Laravel нельзя получить доступ к сессии в конструкторе контроллера?

Как исправить ошибку "Session store not set on request", возникающую при вызове метода `session()` в конструкторе `AbstractController`, который вызывается из `PageController`?
  • 4 января 2024 г. 17:08
Ответы на вопрос 2
В Laravel, сессия и многие другие службы не инициализируются в момент создания контроллера, потому что посредники (middleware), которые обрабатывают сессии, ещё не были выполнены. Поэтому, если вы попытаетесь получить доступ к сессии в конструкторе контроллера, сессия не будет установлена, и вы получите ошибку "Session store not set on request".

Чтобы исправить эту проблему и получить доступ к сессии в контроллере, вы можете использовать один из следующих подходов:

1. Использование middleware:
   Вы можете использовать middleware для доступа к сессии и выполнения каких-либо действий с ней. Создайте middleware, если оно ещё не создано, и установите нужную логику в методе `handle`. Привяжите это middleware к маршруту или группе маршрутов, которые используют ваш контроллер.

2. Middleware Closure в конструкторе контроллера:
   В Laravel вы можете использовать замыкания middleware непосредственно в конструкторе контроллера для отложенного выполнения кода, который требует сессии. Пример такого вызова:
   
   ```php
   public function __construct()
   {
       $this->middleware(function ($request, $next) {
           // Теперь сессия доступна
           $value = session('key'); 

           // Продолжаем выполнение запроса
           return $next($request);
       });
   }
   ```

3. Методы контроллера:
   Вместо использования сессии в конструкторе контроллера установите логику, которая требует сессии, в методах контроллера (например, index, show и пр.), где доступ к сессии уже предоставлен:
   
   ```php
   public function index(Request $request)
   {
       // Здесь можно безопасно использовать сессию
       $value = $request->session()->get('key');
   }
   ```

4. Сервис-провайдеры:
   Если вам нужно работать со ссесией на уровне приложения или инициализировать некоторые значения в сессии перед выполнением любых маршрутов, вы можете использовать сервис-провайдер, чтобы подготовить эти значения.

Выберите подход, который подходит вашему сценарию использования. В большинстве случаев предпочтительно избегать работы с сессией в конструкторе и выполнять необходимые действия в методах, которые обрабатывают HTTP запросы, так как там сессия уже точно была установлена через middleware.
Вроде с версии Laravel 5.3 сессия внутри конструктора контроллера недоступна. Когда это было впервые сделано было много обсуждений на эту тему. 

Посмотри вот эти хаки https://stackoverflow.com/questions/41542802/larav... что-то должно помочь :)
Похожие вопросы