Php 如何使用Laravel 5.6中所有控制器的会话
我看过一些帖子,比如Php 如何使用Laravel 5.6中所有控制器的会话,php,laravel,Php,Laravel,我看过一些帖子,比如 但我没有找到我想要的解决方案 我正在尝试建立一个多语言网站。我使用会话来存储此信息。 我知道在我的控制器中,比如ProductController,function index(){},我可以这样做 $this->request->session()->put('locale', 'en'); $this->request->session()->keep('locale'); $value = $this->request-&
但我没有找到我想要的解决方案 我正在尝试建立一个多语言网站。我使用会话来存储此信息。
我知道在我的控制器中,比如ProductController,function 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());
}
}
您可以使用中间件
并将其注册到web索引中的kernel.php
文件中。它将为每个web请求调用
因此,如果您不想为每个请求调用它,只需在Route::group的相关路由上添加中间件
,然后在kernel.php
中$routeMiddleware
中注册它。我尝试了我能找到的任何解决方案。会话在中间件中不工作,因为会话尚未启动。在这一点上,您将始终得到null
有一条路和一个陷阱。在我的例子中,这就是ArticleController
(L5.6)的工作原理
这确实奏效。但是仅在运行php-artisan-config:clear
或config:cache
之后\Request::get('lang')
在路由中使用?lang=de
请记住,在收到?lang=en
之前,该语言一直是德语。这对我很有用,因为只有部分页面被翻译。这是不友好的搜索引擎优化
之所以这样做,我所理解的是控制器中的\u结构
是缓存的。我不确定这到底是怎么回事
在那里你可以看到“德国的阿蒂克尔”。从那时起,您将一直使用德语,直到您使用英语搜索或单击“英语文章”也许您可以尝试After request中间件?关于中间件的laravel官方页面有请求前和请求后。一周后我会试试这部分。嗯,我试过了。包括运行config:clear。您可以这样做,但您必须这样做,但会话中间件位于内核执行阶梯的更高位置。如果您不想破坏未来的升级,则不建议使用。在L5.3之后,很多人对此表示不满。一个可以理解的借口是加快laravel项目的执行时间。因此,他们将控制器构造构建到bootstrap文件夹中。之后,中间件将错过您想要做的事情。所有工作都已完成,包括构建html(刀片)回复,准备向浏览器发送。你能做的不多,除了可能:这个用户是在线的,把它放在数据库里。原谅我的两个答案似乎相互矛盾。请求后中间件与存在的请求后中间件不同。用laravel站点本身的话来说:“然而,这个中间件将在应用程序处理请求后执行其任务。”这似乎可以归结为kernel.php中中间件的顺序。一些人在改变顺序方面找到了解决办法,另一些人则拒绝了这个想法。我们不知道L5.*会带来什么。在构造中使用一致函数可能会继续工作。
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);
});
}