会话无法在中间件Laravel 5中工作

时间:2015-04-22 12:42:33

标签: php session laravel laravel-5

我试图在Laravel 5中间件中使用Sessions,但它们无法正常工作。 具体来说 - 在句柄方法的开头var_dump(Session::all());给我一个数组的值 - _tokken,然后在这个方法的末尾

Session::put('lang',$locale);
var_dump(Session::all());

给我带有两个值的数组,_tokken和我的lang键,但刷新之后相同,据我所知,第二次刷新后应该有相同的结果。

我可能在Session中间件之前加载了我的中间件,这是真的,然后我切换了,现在我的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',

    ];

所以我问 - 我做错了什么?

编辑:挖掘Illuminate \ 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()的测试不是相关的。

6 个答案:

答案 0 :(得分:7)

您需要使用

\Session::save();

每当您想要保存修改时,我们就要说我想存储用户的语言

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

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

答案 1 :(得分:6)

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

首先我要说的是,我没有Laravel专家,但这种方式适用于Laravel 5.3:

1)php artisan make:middleware 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而不需要适用于Sessions。

但你可以这样做,只需使用App :: setLocale(Session :: get(' locale'))而不是原因包括Session facade。

答案 2 :(得分:1)

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

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

答案 3 :(得分:0)

另外需要注意的是,如果你正在制作一些操纵/检索会话数据的中间件,你需要确保它在StartSession网络中间件之后加载。

答案 4 :(得分:0)

我有同样的问题,如果某些条件成立,我在中间件中设置值并在同一个地方取消设置。

我完全忘了404s,有些文件得到404(缺少图像)所以nginx将请求传递给Laravel应用程序显示404页面,因为它是其他网址我在那里取消了。我认为在会话中存储语言内容存在同样的问题。只需检查您的浏览器网络并查看加载页面时正在进行的请求,您可能同时设置和取消设置

答案 5 :(得分:0)

我有同样的问题。 @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',
    ],
];