Октябрьские сессии CMS ломаются?

Я пытался создать промежуточное программное обеспечение в плагине в CMS за октябрь, который берет из входных данных значение и сохраняет его в сеансе для периодического отображения в шаблоне.

Функция промежуточного программного обеспечения:

  public function handle($request, Closure $next)
  {
      session()->put('foo', input('foo'));
      logger('StartSession: foo: ', [session('foo')]);
      return $next($request);
  }

Регистрация промежуточного программного обеспечения в plugin.php

    public function register()
    {
    $this->app->make('Illuminate\Contracts\Http\Kernel')->prependMiddleware('October\Demo\Middleware\StartSession');
    }

Метод в плагине для доступа к сессии

    public function registerMarkupTags()
    {
       return [
           'functions' => [
               'session' => [Session::class, 'get']
            ]
       ];
    }

Использование в демо-теме

<h1>{{ session('foo') }}</h1>

Это работает при первом запуске. Если я поставлю foo как строку запроса, foo отобразится на странице. Однако при втором запуске, если я изменил строку запроса на bar, foo сохраняется на странице.

Вот пример проблемы в недавно установленном экземпляре October

https://github.com/reed-josh/october-session-issue

1 ответ

Решение

Хм, может быть, ваше промежуточное программное обеспечение выполняется до инициализации сеанса, не уверен

Вы можете добавить свои данные сеанса после того, как все промежуточное программное обеспечение выполнено

class StartSession
{
  public function handle($request, Closure $next)
  {
    $response = $next($request);

    // if we do not pass data hold old value 
    // do not override it with null
    if(input('foo')) {
        session()->put('foo', input('foo'));
    }

    logger('StartSession: foo: ', [session('foo')]);
    return $response;
  }
}

Как это

но убедитесь, что сессия работает, вы добавляете сессию, используя параметры get, это не будет напрямую отражаться в вашем следующем запросе.

Также я заметил, что вы не добавили условие для ввода, лучше добавить его, потому что в противном случае он будет устанавливать null если параметры не переданы и данные сеанса перезаписываются без необходимости.

если есть сомнения, пожалуйста, прокомментируйте.

Другие вопросы по тегам