会话不适用于中间件Laravel 5

Sub*_*ect 10 php session laravel laravel-5

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

Session::put('lang',$locale);
var_dump(Session::all());
Run Code Online (Sandbox Code Playgroud)

给我数组有两个值,_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',

    ];
Run Code Online (Sandbox Code Playgroud)

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

编辑:挖掘Illuminate\Session\Middleware\StartSession我发现了这个 -

//Note that the Laravel sessions do not make use of PHP "native" sessions in any way since they are crappy.
Run Code Online (Sandbox Code Playgroud)

作为评论,所以我对session_status()的测试不是相关的.

Isl*_*yan 7

你需要使用

\Session::save();
Run Code Online (Sandbox Code Playgroud)

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

\Session::put('lang','en');
\Session::save();
Run Code Online (Sandbox Code Playgroud)

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

  • 有时候这是必要的.如果执行`redirect() - > route('myroute') - > send()`,它不会存储会话数据,所以你应该先添加`Session :: save();`. (2认同)
  • 使用 v5.8 我还发现中间件调用的函数内部有必要。 (2认同)

Woo*_*DRN 6

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

首先我要说的是,我不是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,
Run Code Online (Sandbox Code Playgroud)

请注意,这个新的中间件在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);
    }
}
Run Code Online (Sandbox Code Playgroud)

请注意,我在这个例子中没有使用Session.那是因为当我在StartSession类之后添加我的中间件时,会话会起作用,但是Auth :: user()会再次可用,所以我可以使用Auth :: user() - > locale,根本不需要Sessions.

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

  • 第 2 点帮助了我,即新的中间件出现在 StartSession 类之后。谢谢 :) (2认同)

Hay*_*HİN 5

我有同样的问题。@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',
    ],
];
Run Code Online (Sandbox Code Playgroud)