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 的内容。
我正在尝试在 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 的内容。