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

时间:2016-01-22 19:24:34

标签: php laravel session laravel-5

我希望在Laravel加载任何内容之前根据网址设置会话(如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设置它肯定不是一个好主意

1 个答案:

答案 0 :(得分:2)

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

\Illuminate\Session\Middleware\StartSession::class

启动服务提供商时,此中间件尚未执行,因为所有中间件都在服务提供商启动阶段后执行

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

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

Service Providers -> Middlewares -> Controllers -> Views 

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