Php 如何在Laravel中加载任何内容之前设置会话变量?
我想在加载Laravel中的任何内容之前,根据URL(如或)设置一个会话,并考虑在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
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变量,并让中间件在LaravelStartSession
中间件之后执行,以便可以访问会话
在中间件中设置变量应该足够好,因为Laravel的请求周期是:
Service Providers -> Middlewares -> Controllers -> Views
因此,在中间件中设置会话将使变量在控制器和视图中可用整个应用程序中的语言都是使用会话(“当前_语言”)获取的
。这可以使用语言开关按钮进行设置,但出于统计目的,我们希望在每个子域中放置语言。由于子域需要直接访问,我需要设置每个会话的语言变量如果用户使用地址,它当然应该将内容的语言更改为西班牙语,因此会话需要存储谢谢。现在我只是将它移动到VerifyCsrfToken中的句柄
方法,它就像一个符咒:)@AlvinBakker:不客气。我建议您为您的功能创建一个自定义中间件