如何在Laravel 5.6中为所有控制器使用会话

时间:2018-04-02 04:50:09

标签: php laravel

我看过一些帖子,比如
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());
  }
}

但这不起作用。或者我应该在某个地方这样做,有些在中间件之后,我对此并不熟悉。有人可以给我一些建议吗?

2 个答案:

答案 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:clearconfig:cache之后。 \Request::get('lang')在路线中使用?lang=de

请记住,在?lang=en到来之前,该语言会保留德语。这对我很有用,因为只有部分页面被翻译。它不是SEO友好。

这有效的原因和我理解的是控制器中的__construct被缓存。我不确定这究竟是如何起作用的。

Check this working example您在Deutsch&#39;中看到了Artikel。从那里开始,您将继续使用德语,直到您使用英语搜索或点击“英语文章”