简体   繁体   中英

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

I want to set a session based on the URL (like http://de.domain.com or http://es.domain.com ) before anything in Laravel loads and thought to do this in the 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]);
    }
}

But this is not working at all. Setting it in the Routes sets the session, but after pages are loaded and thus working on the next page, instead on the current one.

What's the best approach? Cause setting it in the Routes is surely not a good idea

You can't set a session variable in a service provider because in Laravel the session is initialized in this middleware:

\Illuminate\Session\Middleware\StartSession::class

When the service providers are booted, this middleware has not been executed, because all the middleware execute after the service providers boot phase

So, the best approach would be to populate the session variable in a middleware, and let the middleware execute after Laravel StartSession middleware, so that the session would be accessible.

Setting the variable in a middleware should be good enough for you, as the Laravel's request cycle is:

Service Providers -> Middlewares -> Controllers -> Views 

So, setting the session in a middleware will let the variable be available in your controllers and views

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM