如何设置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
会显示主登录表单。
由于您未在第一个路径中指定域(由LoginController
处理),因此它也应对somecompany.mysite.com
子域有效。
为了解决这个问题,我建议尝试为第一条路线添加更多特异性,并用Route::domain('mysite.com')
将其封闭。
Laravel路由器始终采用第一个匹配路由,并且第一个匹配路由最后匹配。