【问题标题】:October CMS sessions are breaking?十月 CMS 会议中断?
【发布时间】:2019-03-17 01:18:02
【问题描述】:

我一直在尝试在十月 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 会保留在页面上。

这是一个新安装的十月实例中的问题示例

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

【问题讨论】:

    标签: php laravel octobercms


    【解决方案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

    如有任何疑问,请发表评论。

    【讨论】:

    • 是的,这是一种解决方法。它确实需要我首先在页面上检查输入,以防它被更改并且我需要在同一个请求上显示它,然后如果输入未设置,则从会话中获取。我确实认为这是一个错误,但我已经提交了错误报告。这是一个体面的工作,所以我将投票作为答案,谢谢。
    • 我不确定its not a bug 否则会话工作得很好,我也使用过会话,它工作得很好。但我想did not use in middleware 所以我不能确定它是不是 bug 左右...... :)
    猜你喜欢
    • 2018-04-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多