【问题标题】:Laravel 7 session values not retained after redirect重定向后未保留 Laravel 7 会话值
【发布时间】:2020-07-16 22:38:39
【问题描述】:

我正在尝试在 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');

我有一个中间件,它是“网络”中间件的一部分。我可以看到它在每次页面加载时都使用,但所需的值不存在

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

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

我已经在这里和其他地方查看了几十个类似的问题,但似乎没有一个涵盖这个确切的场景

【问题讨论】:

    标签: laravel session redirect session-variables http-redirect


    【解决方案1】:

    我已经检查了您的方案,并在我的笔记本电脑上做了同样的事情。会话工作正常。

    这是我的实现。

    环境文件

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

    内核.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 时,它会显示以下结果。

    但是当我打开网址时

    设置语言环境/en

    然后在会话中设置“en”,进一步的请求给我以下输出。

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

    【讨论】:

    • 谢谢,我用的是\Illuminate\Support\Facades\App,而不是\App,解决了这个问题。我现在觉得很愚蠢:)
    猜你喜欢
    • 2016-08-27
    • 1970-01-01
    • 2021-11-29
    • 2016-03-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-15
    • 1970-01-01
    相关资源
    最近更新 更多