由於 Laravel 路由子域名匹配不支援正規表示式,當我們需要 api.example.com
而不是 example.com/api
時,需要修改路由服務提供者 app/Providers/RouteServiceProvider.php
:
public function map()
{
$subdomain = strstr(request()->server('HTTP_HOST'), '.', true);
$router = base_path("routes/{$subdomain}.php");
if (file_exists($router)) {
Route::domain($subdomain . '.' . config('app.domain'))
->middleware('api' === $subdomain ? 'api' : 'web')
->namespace($this->namespace . '\\' . studly_case($subdomain))
->group($router);
}
}
然後在 config/app.php
中新增:
'domain' => env('APP_DOMAIN'),
最後在 .env.example
和 .env
中設定對應的 APP_DOMAIN
,如:
APP_DOMAIN=example.test
這樣,訪問 module-name.example.test
時,就會載入 routes/module-name.php
定義的理由啦,對應控制器的名稱空間為 app\Http\Controllers\ModuleName
。
該方法的優點是:
- 同時支援多種環境的不同域名,如本地環境的
api.example.test
和生產環境的api.example.com
。 - 新增新模組簡單,只要在
routes
目錄建立路由的定義檔案,如routes/admin.php
即可。 - 控制器方法不會注入多餘的路由引數。
TODO:
- 支援 FQDN 對映。
思考:
- 這樣做好,還是一個域名對應一個 repo 好,還是使用子目錄?