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

Laravel子域名多租户:登录注册页$errors未定义及Session存储错误排查

Laravel多租户(archtechx/tenancy)登录页错误排查与解决

错误原因分析

你遇到的两个错误本质是登录/注册路由未经过必要的中间件导致的:

  • Undefined variable $errors:视图中的$errors变量由web中间件组内的ShareErrorsFromSession中间件提供,缺少该中间件时视图无法获取验证错误变量。
  • Session store not set on request:web中间件组内的StartSession中间件负责初始化会话存储,没有它的话,Auth相关操作无法调用session实例。

另外,注册表单数据存入中央数据库的问题,也是因为Auth::routes()未经过InitializeTenancyByDomain中间件,请求默认使用中央数据库连接。

从你提供的tenant.php代码来看,Auth::routes()被放在了租户中间件组的外面,导致登录/注册请求完全跳过了web中间件和租户初始化逻辑。

解决步骤

1. 调整路由中间件结构

将Auth::routes()移到包含web和租户初始化中间件的路由组内,同时把需要登录权限的路由单独拆分到子组(避免登录页本身要求auth验证):

Route::middleware([
    'web',
    InitializeTenancyByDomain::class,
    PreventAccessFromCentralDomains::class,
])->group(function () {
    // 登录/注册路由,无需auth中间件
    Auth::routes();

    // 需要登录的租户专属路由
    Route::middleware(['auth', CheckModuleMiddleware::class])->group(function () {
        Route::get('/', function () {
            return 'This is your multi-tenant application. The id of the current tenant is ' . tenant('id');
        });

        Route::resource('users', App\Http\Controllers\UserController::class);
    });
});

2. 验证Session配置

  • 如果你使用database作为Session驱动,确保已生成并迁移Session表:
    php artisan session:table
    php artisan migrate
    
  • 多租户场景下,根据需求配置Session存储位置:
    • 若希望Session存在中央数据库,在config/session.php中设置'connection' => 'central'(需对应你的中央数据库连接名);
    • 若需租户专属Session,参考archtechx/tenancy文档配置租户Session隔离。

3. 清除缓存

修改路由和配置后,执行以下命令清除缓存确保生效:

php artisan route:clear
php artisan config:clear
php artisan cache:clear

内容的提问来源于stack exchange,提问作者Arsalan Ahmed

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 04:37:27