Laravel 域名模組繫結

chanjsq發表於2018-12-17

由於 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:

  1. 支援 FQDN 對映。

思考:

  • 這樣做好,還是一個域名對應一個 repo 好,還是使用子目錄?

相關文章