Функциональный тестовый сервер Symfony2 с параметром SERVER_NAME

Я разработал многопользовательское приложение. Существует многоуровневый администратор (т. Е. Http://root.com/admin ), а также весь доступ к сайтам (например, http://site1.com , http://site2.com … ).

Чтобы обрабатывать маршрутизацию (многоузловые админки или дочерние сайты), я устанавливаю UseCanonicalName для конфигурации vhost:

ServerName root.com ServerAlias media.site1.com site1.com media.site2.com, site2.com ... UseCanonicalName On 

Поэтому я уверен, что $ request-> server-> get ('SERVER_NAME') всегда будет возвращаться в данном случае root.com, и я использую это в процессе маршрутизации, чтобы сделать разницу между корневым доменом (для целей администратора) дочерние сайты и 404 контента.

Он отлично работает в реальной жизни, но когда дело доходит до тестирования, кажется, что UseCanonicalName не заставляет SERVER_NAME с ServerName, определенным в vhost.

Дамп от обычного клиента Chrome:

 array(34) { 'HTTP_HOST' => string(9) string 'site1.com' ... 'HTTP_USER_AGENT' => string(105) 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.106 Safari/537.36' 'SERVER_NAME' => string(8) 'root.com' ... } 

Дамп из тестового клиента

 array(16) { 'SERVER_NAME' => string(9) "site1.com" 'HTTP_HOST' => string(9) "site1.com" 'HTTP_USER_AGENT' => string(19) "Symfony2 BrowserKit" ... } 

Я попытался заставить SERVER_NAME на тестовом клиенте:

 $crawler = $this->client->request('GET', $route, [], [], ['SERVER_NAME' => 'root.com']); 

Но это ничего не меняет, у меня все еще есть значение SERVER_NAME, равное HTTP_HOST, которое закручивает все, когда дело доходит до тестирования дочерних сайтов FO или BO (когда имеет значение разница между значениями SERVER_NAME и HTTP_HOST).

Так,

  • Почему Symfony2 BrowserKit является директивой UseCanonicalName нечувствительной?
  • Как я могу заставить его использовать параметры класса клиента?

С моей точки зрения, я, наконец, сумел найти способ преодолеть проблему: я перегрузил класс Client (Symfony \ Bundle \ FrameworkBundle \ Client), специально запросив метод после вызова filterRequest:

 public function request($method, $uri, array $parameters = array(), array $files = array(), array $server = array(), $content = null, $changeHistory = true) { if ($this->isMainRequest) { $this->redirectCount = 0; } else { ++$this->redirectCount; } $uri = $this->getAbsoluteUri($uri); $server = array_merge($this->server, $server); if (isset($server['HTTPS'])) { $uri = preg_replace('{^'.parse_url($uri, PHP_URL_SCHEME).'}', $server['HTTPS'] ? 'https' : 'http', $uri); } if (!$this->history->isEmpty()) { $server['HTTP_REFERER'] = $this->history->current()->getUri(); } if (empty($server['HTTP_HOST'])) { $server['HTTP_HOST'] = $this->extractHost($uri); } $server['HTTPS'] = 'https' == parse_url($uri, PHP_URL_SCHEME); $this->internalRequest = new Request($uri, $method, $parameters, $files, $this->cookieJar->allValues($uri), $server, $content); $this->request = $this->filterRequest($this->internalRequest); // MY ADDITION // $this->request->server->replace(array_merge($this->request->server->all(), $server)); // /MY ADDITION // if (true === $changeHistory) { $this->history->add($this->internalRequest); } if ($this->insulated) { $this->response = $this->doRequestInProcess($this->request); } else { $this->response = $this->doRequest($this->request); } $this->internalResponse = $this->filterResponse($this->response); $this->cookieJar->updateFromResponse($this->internalResponse, $uri); $status = $this->internalResponse->getStatus(); if ($status >= 300 && $status < 400) { $this->redirect = $this->internalResponse->getHeader('Location'); } else { $this->redirect = null; } if ($this->followRedirects && $this->redirect) { return $this->crawler = $this->followRedirect(); } return $this->crawler = $this->createCrawlerFromContent($this->internalRequest->getUri(), $this->internalResponse->getContent(), $this->internalResponse->getHeader('Content-Type')); } - public function request($method, $uri, array $parameters = array(), array $files = array(), array $server = array(), $content = null, $changeHistory = true) { if ($this->isMainRequest) { $this->redirectCount = 0; } else { ++$this->redirectCount; } $uri = $this->getAbsoluteUri($uri); $server = array_merge($this->server, $server); if (isset($server['HTTPS'])) { $uri = preg_replace('{^'.parse_url($uri, PHP_URL_SCHEME).'}', $server['HTTPS'] ? 'https' : 'http', $uri); } if (!$this->history->isEmpty()) { $server['HTTP_REFERER'] = $this->history->current()->getUri(); } if (empty($server['HTTP_HOST'])) { $server['HTTP_HOST'] = $this->extractHost($uri); } $server['HTTPS'] = 'https' == parse_url($uri, PHP_URL_SCHEME); $this->internalRequest = new Request($uri, $method, $parameters, $files, $this->cookieJar->allValues($uri), $server, $content); $this->request = $this->filterRequest($this->internalRequest); // MY ADDITION // $this->request->server->replace(array_merge($this->request->server->all(), $server)); // /MY ADDITION // if (true === $changeHistory) { $this->history->add($this->internalRequest); } if ($this->insulated) { $this->response = $this->doRequestInProcess($this->request); } else { $this->response = $this->doRequest($this->request); } $this->internalResponse = $this->filterResponse($this->response); $this->cookieJar->updateFromResponse($this->internalResponse, $uri); $status = $this->internalResponse->getStatus(); if ($status >= 300 && $status < 400) { $this->redirect = $this->internalResponse->getHeader('Location'); } else { $this->redirect = null; } if ($this->followRedirects && $this->redirect) { return $this->crawler = $this->followRedirect(); } return $this->crawler = $this->createCrawlerFromContent($this->internalRequest->getUri(), $this->internalResponse->getContent(), $this->internalResponse->getHeader('Content-Type')); } 

Сделав это, я принудительно слияю с параметрами $ server, переданными методу запроса и действительными параметрами сервера, содержащимися в $ this-> request-> server.

Такое слияние уже сделано выше ($ server = array_merge ($ this-> server, $ server);) но по какой-то причине я не могу объяснить, filterRequest вызывает вид «сброса» запроса, сметая параметры пользовательского сервера ,

Я не вижу явно глубоких последствий этого в отношении подзапроса. AFAIK, он просто объединит мои пользовательские параметры сервера в каждом запросе или подзапросе, исходящем из первого.

С другой стороны, знает ли кто-нибудь, почему filterRequest (который является только байпасом) сбросит всю переменную сервера?

PS: когда я столкнулся с другой (но все же связанной проблемой) с функциональными сеансами тестирования, я задал еще один вопрос