Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/252.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何使用Laravel 5.6中所有控制器的会话_Php_Laravel - Fatal编程技术网

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