我希望在Laravel加载任何内容之前根据网址设置会话(如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
设置它肯定不是一个好主意
答案 0 :(得分:2)
您无法在服务提供商中设置会话变量,因为在Laravel中会话已在此中间件中初始化:
\Illuminate\Session\Middleware\StartSession::class
启动服务提供商时,此中间件尚未执行,因为所有中间件都在服务提供商启动阶段后执行
因此,最好的方法是在中间件中填充会话变量,让中间件在Laravel StartSession
中间件之后执行,以便可以访问会话。
在中间件中设置变量应该足够好,因为Laravel的请求周期是:
Service Providers -> Middlewares -> Controllers -> Views
因此,在中间件中设置会话将使变量在控制器和视图中可用