Laravel 11:无法同时启用普通会话与闪存消息
Laravel 11 会话与闪存消息二选一冲突问题
问题描述
在Laravel 11中遇到会话功能冲突:普通持久化会话与闪存消息无法同时正常工作,只能二选一:
- 注释
StartSession等中间件时:闪存消息正常显示,但普通会话无法持久化 - 启用上述中间件时:普通会话持久化正常,但闪存消息在重定向后消失
代码示例
控制器代码
public function switchLang(Request $request, $locale) { $request->session()->put('locale', $locale); // 普通持久化会话 return redirect() ->back() ->with('flash_message', '语言更换成功.') // 闪存消息 ->with('flash_type', 'success'); }
视图代码
{{-- 闪存消息展示 --}} @if(session('flash_message')) <div class="alert alert-{{ session('flash_type', 'info') }}"> {{ session('flash_message') }} </div> @endif {{-- 普通会话展示 --}} {{ session('locale') }}
闪存生效但普通会话失效的app.php配置
return Application::configure(basePath: dirname(__DIR__)) ->withMiddleware(function (Middleware $middleware) { // 注释以下代码后,闪存消息生效但普通会话失效 // $middleware->use([ // \Illuminate\Session\Middleware\StartSession::class, // \Illuminate\View\Middleware\ShareErrorsFromSession::class, // \App\Http\Middleware\VerifyCsrfToken::class, // ]); }) ->create();
普通会话生效但闪存失效的app.php配置
return Application::configure(basePath: dirname(__DIR__)) ->withMiddleware(function (Middleware $middleware) { // 取消注释以下代码后,普通会话生效但闪存消息失效 $middleware->use([ \Illuminate\Session\Middleware\StartSession::class, \Illuminate\View\Middleware\ShareErrorsFromSession::class, \App\Http\Middleware\VerifyCsrfToken::class, ]); }) ->create();
config/session.php配置
return [ 'driver' => env('SESSION_DRIVER', 'database'), 'lifetime' => env('SESSION_LIFETIME', 120), 'expire_on_close' => false, 'encrypt' => env('SESSION_ENCRYPT', false), 'files' => storage_path('framework/sessions'), 'connection' => env('SESSION_CONNECTION'), 'table' => env('SESSION_TABLE', 'sessions'), 'store' => env('SESSION_STORE'), 'lottery' => [2, 100], 'cookie' => env( 'SESSION_COOKIE', Str::slug(env('APP_NAME', 'laravel'), '_').'_session' ), 'path' => env('SESSION_PATH', '/'), 'domain' => env('SESSION_DOMAIN'), 'secure' => env('SESSION_SECURE_COOKIE'), 'http_only' => env('SESSION_HTTP_ONLY', true), 'same_site' => env('SESSION_SAME_SITE', 'lax'), 'partitioned' => env('SESSION_PARTITIONED_COOKIE', false), ];
调试日志
闪存消息生效(普通会话失效)时的会话内容
[2024-11-21 02:26:00] First Request: { "_token": "o5IooR4tva9abbacvE14SPzS1EKR7XKj7RKO8UWt", "_flash": {"old": ["flash_message", "flash_type"], "new": []}, "flash_message": "语言更换成功.", "flash_type": "success" }
普通会话生效(闪存消息失效)时的会话内容
{ "_token": "o5IooR4tva9abbacvE14SPzS1EKR7XKj7RKO8UWt", "_flash": {"old": [], "new": []}, "locale": "en" }
环境信息
- Laravel版本:11
- PHP版本:8.2
- 会话驱动:database
- 会话配置:使用database驱动
已尝试方案
- 使用
session()->flash()方法设置闪存消息 - 使用
redirect()->with()方法设置闪存消息 - 切换
app.php中的中间件配置 - 检查中间件执行顺序
- 验证会话表存在且迁移已执行
- 自定义闪存实现(可生效,但希望使用Laravel内置功能)
内容的提问来源于stack exchange,提问作者Jon Kim
相关产品推荐
相关产品推荐

