You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 05:07:16