【问题标题】:How to use session for all controllers in Laravel 5.6如何在 Laravel 5.6 中为所有控制器使用会话
【发布时间】:2018-09-11 07:50:28
【问题描述】:

我看过一些帖子,比如
Laravel5 - can't get Sessions working
Laravel 5 - session doesn't work

但我没有得到我想要的解决方案。

我正在尝试建立一个多语言网站。我使用会话来存储它。
我知道在我的控制器中,比如 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中使用,所以我只需要做一次session set并且只获取一次,而不是在我创建的每个控制器中。

<?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());
  }
}

但这不起作用。或者我应该在某个地方做这个,在中间件之后,我不熟悉这个。谁能给我一些建议?

【问题讨论】:

    标签: php laravel


    【解决方案1】:

    您可以使用middleware 并将其注册到网络索引中的kernel.php 文件中。每个网络请求都会调用它。

    因此,如果您不想为每个请求调用它,只需在相关路由上添加 middleware,例如 Route::group 并将其注册到 kernel.php 中的 $routeMiddleware

    【讨论】:

      【解决方案2】:

      我尝试了我能找到的任何解决方案。 Session 在中间件中不起作用,因为 Session 尚未开始。此时你总是会得到 null 。

      有一个方法和一个陷阱。这在我的情况下是如何工作的 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 在哪里看到“Artikel in Deutsch”。从那里你会一直保持德语,直到你用英语搜索或点击“英语文章”

      【讨论】:

      • 也许你可以试试 After request 中间件?关于 Middleware 的 laravel 官方页面有 Before request 和 After request。我会在一周后尝试这部分。
      • 好吧,我试过了。包括运行 config:clear。您可以这样做,但您必须在内核中的执行阶梯上使用更高的会话中间件。如果您不想破坏未来的升级,不推荐。很多人在 L5.3 之后抱怨这个。可以理解的借口是加快 laravel 项目的执行时间。所以他们将控制器结构构建到引导文件夹中。
      • 中间件之后会错过你想做的事情。一切都完成了,包括构建 html(刀片)回复,准备向浏览器发送。除了可能之外,您无能为力:此用户在线,将其放入数据库。
      • 原谅我的 2 个答案似乎矛盾。 After请求中间件与确实存在的afterMiddleware不同。用 laravel 网站本身的话来说:“但是,这个中间件会在请求被应用程序处理后执行它的任务”
      • 这似乎都归结为 kernel.php 中中间件的顺序。有些人找到了改变顺序的解决方案,有些人拒绝了这个想法。我们不知道 L5.* 会带来什么。在构造中使用一致的函数可能会继续工作。
      猜你喜欢
      • 2016-08-25
      • 2018-09-24
      • 1970-01-01
      • 1970-01-01
      • 2016-08-24
      • 1970-01-01
      • 2019-01-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多