Laravel多租户:配置租户API路由及解决路由命名冲突
问题解决方案
问题1:租户Web路由转API路由解决CSRF校验问题
要让租户路由支持API调用(如foo.localhost:8000/api/v1/login)并避开CSRF校验,按以下步骤修改:
调整租户路由中间件与前缀
打开租户路由文件(routes/tenant.php),将原有的web中间件组替换为api中间件组,并添加api/v1前缀:// 修改后的API风格租户路由 Route::prefix('api/v1') ->middleware(['api', 'tenant']) ->group(function () { // 保留POST登录接口(API无需登录页面) Route::post('/login', [TenantLoginController::class, 'login'])->name('tenant.login'); // 其他租户API路由按此格式添加,比如: // Route::get('/dashboard', [TenantDashboardController::class, 'index'])->name('tenant.dashboard'); });api中间件组默认不启用CSRF校验,适配Postman等API工具直接调用api/v1前缀明确标识API版本,便于后续迭代维护
适配API认证逻辑
如果原登录逻辑依赖Session(Web认证),需调整为API友好的认证方式:- 若使用Laravel Sanctum,需在租户API路由中添加
auth:sanctum中间件保护后续接口 - 登录接口返回Token,后续请求在Header中携带
Authorization: Bearer {token}完成身份校验
- 若使用Laravel Sanctum,需在租户API路由中添加
问题2:解决路由缓存时的名称重复错误
LogicException提示login路由名重复,是因为中央面板(routes/web.php)与租户面板的路由使用了相同的名称标识,按以下步骤修复:
统一路由命名规范
给中央面板和租户的路由添加专属前缀,确保名称全局唯一:- 中央面板路由(
routes/web.php):Route::middleware('web')->group(function () { Route::get('/login', [CentralLoginController::class, 'showLoginForm'])->name('central.login'); Route::post('/login', [CentralLoginController::class, 'login'])->name('central.login'); // 其他中央路由同理添加前缀,比如: // Route::get('/dashboard', [CentralDashboardController::class, 'index'])->name('central.dashboard'); }); - 租户路由(
routes/tenant.php):
参考问题1中的修改,使用tenant.login、tenant.dashboard等带前缀的命名
- 中央面板路由(
清理并重建路由缓存
执行以下命令清除旧缓存,再重新生成路由缓存:php artisan route:clear php artisan route:cache
内容的提问来源于stack exchange,提问作者Maison012
相关产品推荐
相关产品推荐

