【问题标题】:How to set a session variable before anything loads in Laravel?如何在 Laravel 中加载任何内容之前设置会话变量?
【发布时间】:2016-04-29 12:10:22
【问题描述】:

我想在 Laravel 中的任何内容加载之前基于 URL(如 http://de.domain.comhttp://es.domain.com)设置一个会话,并考虑在 ConfigServiceProvider 中执行此操作:

public function boot() {
    // set language
    $parse = parse_url(url());
    $url_array = explode('.', $parse['host']);
    if($url_array[0] == 'domain' || $url_array[0] == 'www') {
        Session::put('current_language', Language::where('short', 'EN')->get());
        App::setLocale('en');
    } else {
        Session::put('current_language', Language::where('short', strtoupper($url_array[0]))->get());
        App::setLocale($url_array[0]);
    }
}

但这根本不起作用。在Routes 中设置它会设置会话,但在页面加载并因此在下一页上工作之后,而不是在当前页面上。

最好的方法是什么?因为在Routes 中设置它肯定不是一个好主意

【问题讨论】:

  • 整个应用程序中的语言都是使用session('current_language') 获取的。这可以使用语言切换按钮进行设置,但出于统计目的,我们希望为每个子域设置语言。由于子域需要直接访问,我需要为每个会话变量设置语言
  • 如果用户使用es.domain 地址当然应该将内容的语言更改为西班牙语,因此需要存储会话

标签: php laravel session laravel-5


【解决方案1】:

你不能在服务提供者中设置会话变量,因为在 Laravel 中会话是在这个中间件中初始化的:

\Illuminate\Session\Middleware\StartSession::class

服务提供者启动时,这个中间件并没有被执行,因为所有的中间件都是在服务提供者启动阶段之后执行的

因此,最好的方法是在中间件中填充会话变量,并让中间件在 Laravel StartSession 中间件之后执行,这样会话就可以访问了。

在中间件中设置变量对你来说应该足够好了,因为 Laravel 的请求周期是:

Service Providers -> Middlewares -> Controllers -> Views 

因此,在中间件中设置会话将使变量在您的控制器和视图中可用

【讨论】:

  • 非常感谢。现在我只是将它移到了 VerifyCsrfToken 中的 handle 方法,它就像一个魅力:)
  • @AlvinBakker:不客气。我建议您为您的功能创建一个自定义中间件
猜你喜欢
  • 2017-01-15
  • 1970-01-01
  • 2015-04-09
  • 1970-01-01
  • 2014-10-09
  • 1970-01-01
  • 2018-05-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多