Получить среду внутри контроллера - PullRequest
6 голосов
/ 25 ноября 2011

У меня ситуация на одном из моих контроллеров, доступ к которому возможен только через AJAX, у меня есть следующий код.

if (!$request->isXmlHttpRequest()) {
    $response = new Response();
    $response->setContent('AJAX requests only!');
    return $response;
}

Когда я тестирую, это вызывает у меня проблему, потому что запрос фактически не был сделан через AJAX. Это каждый раз нарушает мои тесты. Как мне обойти это?

Мои идеи:

  1. Я пытался установить заголовок сервера, но безуспешно.
  2. Проверьте, не нахожусь ли я в тестовой среде на контроллере, и не проверяйте, если это так. Я знаю, что это грязно, но это будет работать. : - / Проблема была в том, что я не мог понять, как узнать, в какой среде я нахожусь.

У кого-нибудь еще есть какие-либо идеи или советы, которые мне не хватает, чтобы заставить работать одно из вышеперечисленных?

Ответы [ 2 ]

8 голосов
/ 26 ноября 2011

Конечно, в случае Icode4food лучше использовать решение Мэтта, но вот как найти текущую среду:

$this->container->getParameter(‘kernel.environment’)
5 голосов
/ 25 ноября 2011

Глядя на код для isXmlHttpRequest в классе Request и метод getHeaders в классе ServerBag, фрагмент кода, приведенный ниже, должен помочь:

$client->request(
    'GET',
    '/path/to/test',
    array(),
    array(),
    array(
        'HTTP_X-Requested-With' => 'XMLHttpRequest',
    )
);

Я не проверял это лично, но я думаю, что это должно работать. Строка кода ниже в Request используется для проверки, является ли http-запрос XmlHttpRequest.

return 'XMLHttpRequest' == $this->headers->get('X-Requested-With');

В коде $this->headers устанавливается с помощью:

$this->headers = new HeaderBag($this->server->getHeaders());

Метод getHeaders создает массив заголовков. Каждая серверная переменная, начинающаяся с HTTP_, плюс некоторые специальные серверные переменные, такие как CONTENT_TYPE, помещаются в этот массив.

Надеюсь, это поможет.

С уважением,
Matt

...