WebTestCase, Silex и $_GET

У меня возникли некоторые проблемы в WebTestCase с использованием Silex: в одном из действий моего контроллера мне нужен параметр, переданный через обычный $_GET (мне нужно, поскольку это URL-адрес, и Apache интерпретирует% 2F, если он находится вне запроса строка - см. Переменные URL с %2f не обрабатываются силекс например)

Вот как определяется мой маршрут:

$controller
   ->get('/get', <controller action>)
   ->value('url', (!empty($_GET['url']) ? $_GET['url'] : false));

Он отлично работает в браузере, но, похоже, не работает внутри WebTestCase, как этот: $_GET остается пустым...

$client = $this->createClient();
$client->request('GET', '/get?url=' . urlencode($url));

изменить

Я только что провел быстрый эксперимент: если я сделаю следующее на своем маршруте:

$controller
        ->get('/get/{url}', <action>)
        ->assert('url', '.*');

А это в тесте:

$client = $this->createClient();
$client->request('GET', '/get/' . urlencode($url));

Если все в порядке, $url передается контроллеру... но в браузере он больше не работает, так как проходит через Apache.


person haltabush    schedule 17.06.2015    source источник
comment
Как подвох, вы всегда можете заполнить переменную $_GET перед вызовом $client->request(...), выполнив $_GET['url'] = 'some url'; (кстати, какая проблема у вас со вторым методом? Он тоже должен работать из браузера)   -  person mTorres    schedule 18.06.2015
comment
Проблема в том, что сгенерированный URL-адрес имеет форму /get/http:%2%2....; Apache интерпретирует это как /get/http:// и теряется (выдает 404). Есть способы решить проблему, но вам нужен доступ к конфигурации Apache, чего у меня нет.   -  person haltabush    schedule 18.06.2015
comment
Итак, проблема связана с apache (ссылка, которую вы дали ранее), поэтому я думаю, что вы пока застряли с грязным трюком.   -  person mTorres    schedule 18.06.2015


Ответы (1)


Глобальные переменные сервера (например, $_GET) заполняются Apache. При запуске функционального теста Apache пропускается, поэтому $_GET больше не заполняется. Вместо использования глобальных переменных сервера вы должны использовать объект Request для извлечения параметров GET. Таким образом, фреймворк будет перехватывать как введенные переменные PHPUnit, так и переменные, введенные Apache; затем он сделает их доступными в вашем методе действия через объект запроса, который можно ввести в качестве параметра функции.

Пример извлечения параметра URL:

$url = $request->query->get('url');
person Catalin Trandafir    schedule 17.06.2015
comment
Просто чтобы добавить немного информации, мне пришлось добавить запрос в качестве параметра в действие моего контроллера. Теперь работает нормально, но мне немного жаль, что подпись функции показывает, что требуется $url :( - person haltabush; 17.06.2015