Laravel PHPUnit测试中如何在RouteServiceProvider的map方法内获取子域名?
在Laravel的PHPUnit测试中,如何在RouteServiceProvider的map方法里获取子域名?
没问题,我来给你捋捋怎么实现这个需求。其实Laravel在处理测试请求的时候,会完整模拟HTTP请求的上下文,包括主机名信息,所以我们可以直接在RouteServiceProvider的map方法里拿到子域名,具体操作如下:
1. 在RouteServiceProvider的map方法中解析子域名
你可以利用Laravel的request()助手获取当前请求的主机名,然后根据你的域名结构解析出子域名。比如你的测试用例里用的是subdomain.domain.com这种结构,代码可以这么写:
/** * 定义应用的路由。 * * @return void */ public function map() { $this->mapApiRoutes(); $this->mapWebRoutes(); // 仅在有请求上下文时处理(避免控制台命令等场景报错) if (app()->bound('request') && $host = request()->getHost()) { // 解析子域名,这里假设你的根域名是domain.com,可根据实际情况调整 $rootDomain = env('APP_ROOT_DOMAIN', 'domain.com'); $domainSuffix = '.' . $rootDomain; // 判断当前主机是否属于根域名的子域名 if (str_ends_with($host, $domainSuffix)) { // 提取子域名部分 $subdomain = substr($host, 0, -strlen($domainSuffix)); // 这里可以把子域名存到容器里,方便后续业务逻辑调用 app()->instance('current_subdomain', $subdomain); // 或者直接在这里根据子域名做路由绑定等操作 // 比如:$this->mapSubdomainRoutes($subdomain); } } }
2. 测试用例的写法保持不变
你原来的测试用例写法是正确的,只要传入完整的带子域名的URL,Laravel的测试框架就会自动模拟对应的请求上下文,让request()->getHost()能正确拿到subdomain.domain.com:
/** @test */ public function user_can_see_welcome_page() { $response = $this->call('GET', 'https://subdomain.domain.com'); $response->assertStatus(200); }
额外提示
- 如果你在测试环境用的是
localhost或者其他测试域名,记得在phpunit.xml里配置APP_ROOT_DOMAIN环境变量,比如:<php> <env name="APP_ROOT_DOMAIN" value="localhost"/> </php> - 要注意判断
app()->bound('request'),避免在执行控制台命令等没有HTTP请求的场景下报错,因为这时候request()助手会抛出异常。
内容的提问来源于stack exchange,提问作者lewis4u
相关产品推荐
相关产品推荐

