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隔离。
- 若希望Session存在中央数据库,在
3. 清除缓存
修改路由和配置后,执行以下命令清除缓存确保生效:
php artisan route:clear php artisan config:clear php artisan cache:clear
内容的提问来源于stack exchange,提问作者Arsalan Ahmed
相关产品推荐
相关产品推荐

