由于 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 好,还是使用子目录?
© 著作权归作者所有
举报
发表评论
0/200