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

Laravel多租户:配置租户API路由及解决路由命名冲突

问题解决方案

问题1:租户Web路由转API路由解决CSRF校验问题

要让租户路由支持API调用(如foo.localhost:8000/api/v1/login)并避开CSRF校验,按以下步骤修改:

  1. 调整租户路由中间件与前缀
    打开租户路由文件(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版本,便于后续迭代维护
  2. 适配API认证逻辑
    如果原登录逻辑依赖Session(Web认证),需调整为API友好的认证方式:

    • 若使用Laravel Sanctum,需在租户API路由中添加auth:sanctum中间件保护后续接口
    • 登录接口返回Token,后续请求在Header中携带Authorization: Bearer {token}完成身份校验

问题2:解决路由缓存时的名称重复错误

LogicException提示login路由名重复,是因为中央面板(routes/web.php)与租户面板的路由使用了相同的名称标识,按以下步骤修复:

  1. 统一路由命名规范
    给中央面板和租户的路由添加专属前缀,确保名称全局唯一:

    • 中央面板路由(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等带前缀的命名
  2. 清理并重建路由缓存
    执行以下命令清除旧缓存,再重新生成路由缓存:

    php artisan route:clear
    php artisan route:cache
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 20:59:58