Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/276.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何在Laravel中加载任何内容之前设置会话变量?_Php_Laravel_Session_Laravel 5 - Fatal编程技术网

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

Php 如何在Laravel中加载任何内容之前设置会话变量?,php,laravel,session,laravel-5,Php,Laravel,Session,Laravel 5,我想在加载Laravel中的任何内容之前,根据URL(如或)设置一个会话,并考虑在ConfigServiceProvider中执行此操作: public function boot() { // set language $parse = parse_url(url()); $url_array = explode('.', $parse['host']); if($url_array[0] == 'domain' || $url_array[0] == 'www

我想在加载Laravel中的任何内容之前,根据URL(如或)设置一个会话,并考虑在
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]);
    }
}
但这根本不起作用。在
路由中设置它
将设置会话,但在加载页面并因此在下一页上工作之后,将在当前页面上工作


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

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

\Illuminate\Session\Middleware\StartSession::class
当服务提供者启动时,该中间件尚未执行,因为所有中间件都在服务提供者启动阶段之后执行

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

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

Service Providers -> Middlewares -> Controllers -> Views 

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

整个应用程序中的语言都是使用
会话(“当前_语言”)获取的
。这可以使用语言开关按钮进行设置,但出于统计目的,我们希望在每个子域中放置语言。由于子域需要直接访问,我需要设置每个会话的语言变量如果用户使用地址,它当然应该将内容的语言更改为西班牙语,因此会话需要存储谢谢。现在我只是将它移动到VerifyCsrfToken中的
句柄
方法,它就像一个符咒:)@AlvinBakker:不客气。我建议您为您的功能创建一个自定义中间件