Symfony WebTestCase、Silex和$\u GET

Symfony WebTestCase、Silex和$\u GET,symfony,silex,web-testing,Symfony,Silex,Web Testing,我在使用Silex的WebTestCase上遇到了一些问题:在我的控制器的一个操作中,我需要通过一个普通的$\u GET传递一个参数(我必须这样做,因为它是一个URL,如果%2F在查询字符串之外,Apaches将解释它——请参见示例) 以下是如何定义我的路线: $controller ->get('/get', <controller action>) ->value('url', (!empty($_GET['url']) ? $_GET['url'] :

我在使用Silex的WebTestCase上遇到了一些问题:在我的控制器的一个操作中,我需要通过一个普通的$\u GET传递一个参数(我必须这样做,因为它是一个URL,如果%2F在查询字符串之外,Apaches将解释它——请参见示例)

以下是如何定义我的路线:

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

我只是做了一个快速的实验:如果我在我的路线上做以下操作:

$controller
        ->get('/get/{url}', <action>)
        ->assert('url', '.*');
如果一切正常,$url被传递到控制器。。。但是,当它通过Apache时,它不再在浏览器上工作。

服务器全局变量(如$\u GET)由Apache填充。运行功能测试时,将跳过Apache,因此不再填充$\u GET。您应该使用请求对象来提取GET参数,而不是使用服务器全局变量。这样,框架将拦截PHPUnit注入变量和Apache注入变量;然后,它将通过一个可以作为函数参数注入的请求对象使它们在操作方法中可用

如何提取url参数的示例:

$url = $request->query->get('url');

为了添加一些信息,我不得不将请求作为参数添加到控制器操作中。现在可以正常工作了,但是我有点遗憾,funciton签名显示$url是必需的:(作为一个肮脏的把戏,在调用
$client->request(…)
之前,您可以通过发出
$\u GET['url']='some url';
(顺便问一下,你的第二个方法有什么问题?它应该也可以从浏览器中运行)问题是,由此生成的URL的格式是
/get/http:%2%2….
;Apache将其解释为
/get/http://
,然后丢失(抛出404)。有很多方法可以解决这个问题,但是你需要访问Apache配置,我没有。好吧,所以这个问题与Apache(你之前给出的链接)有关,所以我想你现在只能使用这个肮脏的伎俩了。
$client = $this->createClient();
$client->request('GET', '/get/' . urlencode($url));
$url = $request->query->get('url');