Laravel 7 значений сеанса не сохраняются после перенаправления - PullRequest
0 голосов
/ 04 апреля 2020

Я пытаюсь установить сеанс в 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);

Но это тоже не работает, и я также хочу сохранить значение для продолжительности сеанса, а не только для следующего запроса

Я смотрел на десятки подобных вопросов здесь и в других местах, и ни один из них, похоже, не охватывает этот точный сценарий

1 Ответ

1 голос
/ 05 апреля 2020

Я проверил ваш сценарий и сделал то же самое на своем ноутбуке. Сессия работает нормально.

Вот моя реализация.

env file

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

Middleware

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 в первый раз, он показывает мне следующий результат.

request without settion session

, но когда Я открываю URL

set-locale / en

, затем в сеансе устанавливается "en", и дальнейший запрос дает мне следующий вывод.

enter image description here

Примечание: - Вам может потребоваться очистить содержимое папки сеанса "\ storage \ framework \ session", чтобы очистить вещи сеансов.

...