我看过一些帖子,比如
Laravel5 - can't get Sessions working
Laravel 5 - session doesn't work
但我没有得到我想要的解决方案。
我正在尝试构建一个多语言网站。我使用session来存储它。
我知道在我的控制器中,比如ProductController,函数index(){},我可以这样做
$this->request->session()->put('locale', 'en');
$this->request->session()->keep('locale');
$value = $this->request->session()->get('locale');
dd($value);
dd(Session::all());
Session::put('locale', 'en');
Session::keep('locale');
Session::save();
$value = $this->request->session()->get('locale');
dd($value);
dd(Session::all());
但是我想在Controller.php中使用,所以我只需要进行会话集并且只需要一次,而不是在我创建的每个控制器中。
<?php
namespace App\Http\Controllers;
use Illuminate\Foundation\Bus\DispatchesJobs;
use Illuminate\Routing\Controller as BaseController;
use Illuminate\Foundation\Validation\ValidatesRequests;
use Illuminate\Foundation\Auth\Access\AuthorizesRequests;
use Session;
class Controller extends BaseController
{
use AuthorizesRequests, DispatchesJobs, ValidatesRequests;
public function __construct()
{
Session::put('locale', 'zh');
Session::save('locale');
$value = Session::get('locale');
dd($value);
dd(Session::all());
}
}
但这不起作用。或者我应该在某个地方这样做,有些在中间件之后,我对此并不熟悉。有人可以给我一些建议吗?
答案 0 :(得分:2)
您可以使用middleware
并将其注册到网络索引中的kernel.php
文件中。它将调用每个Web请求。
因此,如果您不想为每个请求调用它,只需在Route :: group的相关路由上添加middleware
,并在kernel.php
$routeMiddleware
中注册它
答案 1 :(得分:0)
我尝试了任何我能找到的解决方案。会话在中间件中不起作用,因为会话还没有开始。此时你总是会变为空。
有一种方法和一种方法。这就是我在ArticleController
(L5.6)
public function __construct()
{
$this->middleware(function ($request, $next)
{
$locale = config('app.fallback_locale');
if (session('locale'))
{
$locale = session('locale');
}
if (\Request::has('lang'))
{
$locale = \Request::get('lang');
session(['locale' => $locale]);
}
\App::setLocale($locale);
return $next($request);
});
}
这确实可以解决问题。但。仅在您运行php artisan config:clear
或config:cache
之后。 \Request::get('lang')
在路线中使用?lang=de
。
请记住,在?lang=en
到来之前,该语言会保留德语。这对我很有用,因为只有部分页面被翻译。它不是SEO友好。
这有效的原因和我理解的是控制器中的__construct
被缓存。我不确定这究竟是如何起作用的。
Check this working example您在Deutsch&#39;中看到了Artikel。从那里开始,您将继续使用德语,直到您使用英语搜索或点击“英语文章”