Php 会话在中间件Laravel 5中不工作

Php 会话在中间件Laravel 5中不工作,php,session,laravel,laravel-5,Php,Session,Laravel,Laravel 5,我试图使用Laravel5中间件中的会话,但它们不起作用。 具体来说-var_dump(Session::all())在handle的开头,方法给我一个数组值-_tokken,然后在这个方法的末尾 Session::put('lang',$locale); var_dump(Session::all()); 给我两个值的数组,_tokken和我的lang键,但在刷新后是相同的,因为我知道在第二次刷新后应该会有相同的结果 我想我可能在会话中间件之前加载了中间件,这是真的,然后我切换了,现在我的K

我试图使用Laravel5中间件中的会话,但它们不起作用。 具体来说-
var_dump(Session::all())在handle的开头,方法给我一个数组值-_tokken,然后在这个方法的末尾

Session::put('lang',$locale);
var_dump(Session::all());
给我两个值的数组,_tokken和我的lang键,但在刷新后是相同的,因为我知道在第二次刷新后应该会有相同的结果

我想我可能在会话中间件之前加载了中间件,这是真的,然后我切换了,现在我的Kernel.php如下所示-

protected $middleware = [
        'Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode',
        'Illuminate\Cookie\Middleware\EncryptCookies',
        'Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse',
        'Illuminate\Session\Middleware\StartSession',
        'Illuminate\View\Middleware\ShareErrorsFromSession',
        'App\Http\Middleware\VerifyCsrfToken',
        'App\Http\Middleware\Language',

    ];
所以我问——我做错了什么

编辑:在Illumb\Session\Middleware\StartSession中挖掘我找到了这个-

//Note that the Laravel sessions do not make use of PHP "native" sessions in any way since they are crappy.
作为注释,因此我对session_status()的测试不相关。

您需要使用

\Session::save();
无论何时您想要保存修改,让我们假设我想要存储用户的语言

\Session::put('lang','en');
\Session::save();

现在刷新时,您将找到新创建的密钥。

另一件需要注意的事情是,如果您正在制作一些中间件来处理/检索会话中的数据,您需要确保它在
启动会话之后加载。

我也遇到了同样的问题,我在登录时使用会话来存储区域设置,然后重定向到主仪表板,但当加载中间件时,会话尚未启动。所以它不起作用

首先,我要说的是,我不是Laravel专家,但这种方式在Laravel 5.3中有效:

1) php artisan make:中间件SetApplicationLanguage

2) 将此添加到app/Http/Kernel.php$middlewareGroup变量:

\Illuminate\Session\Middleware\StartSession::class,
\App\Http\Middleware\SetApplicationLanguage::class,
请注意,这个新中间件位于StartSession类之后

3) 这是我的app/Http/MiddleWare/SetApplicationLanguage.php:

namespace App\Http\Middleware;

use App;
use Closure;
use Illuminate\Support\Facades\Auth;

class SetApplicationLanguage
{

    /**
     * Handle an incoming request.
     *
     * @param \Illuminate\Http\Request $request            
     * @param \Closure $next            
     * @return mixed
     */
    public function handle($request, Closure $next)
    {
        if (isset(Auth::user()->locale)) {
            App::setLocale(Auth::user()->locale);
        }

        return $next($request);
    }
}
注意,在本例中我没有使用Session。这是因为当我在StartSession类之后添加中间件时,会话可以工作,但是Auth::user()将再次可用,因此我可以只使用Auth::user()->locale,而根本不需要会话


但是您可以这样做,只需使用App::setLocale(Session::get('locale')),而不必包括会话外观。

我也有同样的问题,我在中间件中设置值,如果某些条件为真,则在同一位置取消设置


我完全忘记了404,一些文件得到了404(丢失的图像),所以nginx将请求传递给Laravel应用程序以显示404页面,因为这是另一个url,所以我在那里不确定。我认为在会话中存储语言内容也是一个问题。只需检查您的浏览器网络,查看加载页面时发出的请求,您可能同时设置和取消设置

如果您需要当前中间件中的会话,我发现了一个(n)(丑陋的)解决方法

<?php

namespace App\Http\Middleware;

use Closure;
use Illuminate\Session\Middleware\StartSession;

class MiddlewareThatNeedsTheSession
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request $request
     * @param  \Closure $next
     * @return mixed
     */
     public function handle($request, Closure $next)
     {
        return app(StartSession::class)->handle($request, function ($request) use ($next) {

            /** @var Response $response */
            $response = $next($request);

            // do something with session
            session(['foo' => 'bar']);

            return $response;
        });
    }
}

我也有同样的问题@WoodyDRN说您需要将StartSession中间件添加到内核文件中,但这并不是解决此问题的最佳方法。那么,我怎么知道呢?因为我添加并请求验证系统已损坏

解决此问题的最佳方法是将您的语言中间件添加到web中间件阵列

protected $middlewareGroups = [
    'web' => [
        \App\Http\Middleware\EncryptCookies::class,
        \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
        \Illuminate\Session\Middleware\StartSession::class,
        // \Illuminate\Session\Middleware\AuthenticateSession::class,
        \Illuminate\View\Middleware\ShareErrorsFromSession::class,
        \App\Http\Middleware\VerifyCsrfToken::class,
        \Illuminate\Routing\Middleware\SubstituteBindings::class,
        \App\Http\Middleware\Localization::class,
    ],

    'api' => [
        'throttle:60,1',
        'bindings',
    ],
];

我只是删除了我的答案,因为它是不正确的。我在项目的中间件中测试了
Session::all()
,效果很好。很抱歉回答不正确。@limonte别担心,是的,我编写了Session::all()返回\u标记,但不是稍后为我设置自己的值。它的工作方式与预期一样,即\u标记、\u先前和我的自定义values@limonte也许你可以分享你的项目或其他什么?或者私下里帮我?你让它工作了吗?这个
save
方法在Laravel 5.2中不是必需的,有时是必需的。如果执行
redirect()->route('myroute')->send()
,它不会存储会话数据,因此应该添加
session::save()之前。使用v5.8,我还发现有必要在中间件调用的函数中使用它。值得指出的是,这个示例实现了一个“之后”中间件——它在应用程序处理请求之后运行。这可能不是大多数需要中间件会话的人想要的。要更改此设置,请删除
$response=$next($request)行并更改
返回$response行到
返回$next($request)在Laravel 6中为我工作,当时我将中间件添加到$middlewareGroups数组“web”Point 2帮助了我,即新中间件出现在StartSession类之后。谢谢:)那么添加StartSession会破坏你的应用程序?这是哪一个版本的拉威尔?因为对我来说它没有坏,这很有效。为了我。我试图为会话变量中的所有视图设置一个变量。将中间件添加到web组完全有意义,我首先将其添加到全局中间件阵列。谢谢@WoodyDRN很抱歉我回复晚了。我很忙,我忘了。此代码段来自Laravel5.8。