1

我发现了一些说明如何在中间件中动态设置会话生命周期。我创建了一个中间件,它根据路由名称设置配置“session.lifetime”,并将其放在我所有中间件的顶部,以便在调用 StartSession 之前首先调用它。但无论我尝试什么,Laravel 总是采用 env 文件中定义的默认会话生命周期。

知道问题可能是什么吗?Laravel 8(或 7)有什么变化吗?我找到的必须是 Laravel 5 的东西,但我无法找到更多关于它的最新信息..

这就是我的中间件的样子:

     /**
     * Set the session lifetime for the current request.
     *
     * @param  Request   $request      current request
     * @param  Closure   $next         next handler
     * @param  int|null  $lifetimeMin  lifetime in minutes.
     *
     * @return mixed
     */
    public function handle(Request $request, Closure $next, ?int $lifetimeMin = null)
    {
        if ($lifetimeMin !== null) {
            Config::set('session.lifetime', $lifetimeMin);
        } elseif (str_starts_with($request->route()->getName(), 'api.')) {
            $apiLifetime = Config::get('session.lifetime_api', 525600);
            Config::set('session.lifetime', $apiLifetime);
        } elseif (str_starts_with($request->route()->getName(), 'admin.')) {
            $adminLifetime = Config::get('session.lifetime_admin', 120);
            Config::set('session.lifetime', $adminLifetime);
        }

        return $next($request);
    }

坦克为您提供帮助!

4

1 回答 1

0

看看这里:https ://laravel.com/docs/8.x/configuration

Laravel 8 正在使用这样的配置助手:

//To set configuration values at runtime, pass an array to the config helper:
config(['app.timezone' => 'America/Chicago']);

有点像这样?

  if ($lifetimeMin !== null) {
      config(['session.lifetime' => $lifetimeMin]);
  } elseif (str_starts_with($request->route()->getName(), 'api.')) {
      $apiLifetime = config('session.lifetime_api', 525600);
      config(['session.lifetime' => $apiLifetime]);
  } elseif (str_starts_with($request->route()->getName(), 'admin.')) {
      $adminLifetime = config('session.lifetime_admin', 120);
      config(['session.lifetime' => $adminLifetime]);
  }

此外 .. 默认配置从 env 文件中检索值。我可以想象旧的 Config::set 不能再重载它了。您是否尝试过不使用 env() 方法设置配置?

'lifetime' => env('SESSION_LIFETIME', 120),

有点像这样

'lifetime' => 120,
于 2021-01-16T18:28:13.623 回答