如何在 Laravel 中加载任何内容之前设置会话变量


How to set a session variable before anything loads in Laravel?

我想在加载Laravel中的任何内容之前根据URL(如 http://de.domain.com 或 http://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肯定不是一个好主意

您无法在服务提供商中设置会话变量,因为在Laravel中,会话在此中间件中初始化:

'Illuminate'Session'Middleware'StartSession::class

引导服务提供者时,此中间件尚未执行,因为所有中间件在服务提供者引导阶段之后执行

因此,最好的方法是在中间件

中填充会话变量,并让中间件在 Laravel StartSession中间件之后执行,以便可以访问会话。

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

Service Providers -> Middlewares -> Controllers -> Views 

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