我在使用Silex的WebTestCase上遇到一些问题:在我的控制器操作之一上,我需要一个通过普通$ _GET传递的参数(我必须是因为它是一个URL,并且Apaches解释%2F,如果它在外面查询字符串 - 例如,参见Url Variables with %2f not handled by silex
以下是我的路线定义方式:
$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时它不再适用于浏览器。
答案 0 :(得分:1)
服务器全局变量(如$ _GET)由Apache填充。运行功能测试时,会跳过Apache,因此不会再填充$ _GET。您应该使用Request对象来提取GET参数,而不是使用服务器全局变量。这样,框架将拦截PHPUnit注入的变量和Apache注入的变量;然后,它将通过可以作为函数参数注入的Request对象在您的action方法中使用它们。
示例如何提取url参数:
$url = $request->query->get('url');