Laravel 7 重定向后会话值未保留

Laravel 7 session values not retained after redirect

我正在尝试在 Laravel 7 中设置一个会话,它将记住网站应该以哪种语言显示

在我的路线上我有

Route::get('set-locale/{locale}', function ($locale) {
    if (!in_array($locale, ['en', 'nl'])) {
        // todo: return with flash
    }

    \Illuminate\Support\Facades\Session::put('locale', $locale);

    // the session is set here

    return back();
})->name('set-locale');

我有一个中间件,它是 '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,
        Locale::class
    ],
class Locale
{
    public function handle(Request $request, Closure $next, $guard = null)
    {
        dump(Session::all()); // I can see the login info here, not the locale
        if (Session::has('locale')) {
            App::setLocale(Session::get('locale'));
        }

        return $next($request);
    }
}

我没有更改会话的配置,所以它使用默认设置

'driver' => env('SESSION_DRIVER', 'file'),
'lifetime' => env('SESSION_LIFETIME', 120),
'expire_on_close' => false,

我考虑使用

back()->with('locale', $locale);

但这也不起作用,我还想在会话期间保留该值,而不仅仅是下一个请求

我在这里和其他地方查看了数十个类似的问题,其中 none 似乎涵盖了这个确切的场景

我已经检查了你的场景,并在我的笔记本电脑上做了同样的事情。 session 工作正常。

这是我的实现。

env 文件

BROADCAST_DRIVER=log
CACHE_DRIVER=file
SESSION_DRIVER=file
SESSION_LIFETIME=120
QUEUE_DRIVER=sync

中间件

namespace App\Http\Middleware;

use Closure;
use Session;

class Locale
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle($request, Closure $next, $guard = null)
    {
        dump(Session::all()); // I can see the login info here, not the locale
        if (Session::has('locale')) {
            \App::setLocale(Session::get('locale'));
        }

        return $next($request);
    }
}

Kernel.php

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\Locale::class,
        \Laravel\Passport\Http\Middleware\CreateFreshApiToken::class,
    ],
    ...
];

路线

Route::get('/', function () {
    return view('welcome');
});


Route::get('set-locale/{locale}', function ($locale) {
    if (!in_array($locale, ['en', 'nl'])) {
        // todo: return with flash
    }

    \Illuminate\Support\Facades\Session::put('locale', $locale);

    // the session is set here

    return back();
})->name('set-locale');

当我第一次打开 URL 时,它会显示以下结果。

但是当我打开 URL

set-locale/en

然后在 session 上设置 "en" 并且进一步的请求给我以下输出。

注意:- 您可能需要清除 session 文件夹“\storage\framework\sessions”的内容才能清除 session 的内容。