Laravel,不同子域上的相同路径使用错误的控制器

时间:2019-03-31 00:23:10

标签: php laravel laravel-5 url-routing

问题

如何设置Laravel路由,以便:

  • 使用mysite.com/login导航到LoginController
  • 使用somecompany.mysite.com/login导航到TenantLoginController

我在做什么

我有一个Laravel 5.7应用,该应用的典型登录页面为mystite.com/login

我想为此应用设置一个子域,例如somecompany.mysite.com,该子域将具有自己的身份验证。

我希望somecompany用户登录somecompany.mysite.com/login


我尝试过的

主站点登录的路由定义

Route::group(['namespace' => 'App\Http\Controllers\Auth', 'middleware' => ['web']], function () {
    Route::get('login',   'LoginController@showLoginForm')->name('login');
});

子主机登录的路由定义

Route::domain('somecompany.mysite.com')->group(function ($router) {
    $router->group(['namespace' => 'App\Http\Controllers\Tenant\Auth', 'middleware' => ['web']], function($router) {
        $router->get('login',   'TenantLoginController@showLoginForm')->name('somecompany.login');
    });
});

发生了什么

我可以导航到somecompany.mysite.com/login,URL栏显示somecompany.mysite.com/login,但是当我这样做时,请求实际上路由到了'LoginController@showLoginForm'控制器,而不是预期的'TenantLoginController@showLoginForm',并且显示的是典型的登录表单,而不是子域的登录表单。

如果我将路径更改为$router->get('tenant-login'并导航到somecompany.mysite.com/tenant-login,则会显示子域登录表单,而somecompany.mysite.com/login显示主登录表单。

1 个答案:

答案 0 :(得分:2)

由于您没有在第一个路由中指定域(由LoginController处理),因此该域对于somecompany.mysite.com子域也应有效。

要解决此问题,我建议尝试为第一条路线添加更多特异性,并用Route::domain('mysite.com')括起来。

Laravel路由器始终采用第一个匹配路由,最后一个匹配就很好了。