【问题标题】:WebTestCase, Silex and $_GETWebTestCase、Silex 和 $_GET
【发布时间】:2015-06-17 10:12:42
【问题描述】:

我在使用 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 时不再在浏览器上工作。

【问题讨论】:

  • 作为一个肮脏的技巧,您始终可以在调用 $client-&gt;request(...) 之前通过发出 $_GET['url'] = 'some url'; 填充 $_GET 变量(顺便问一下,您的第二种方法有什么问题?它应该可以从浏览器也是)
  • 问题是这个生成的URL是/get/http:%2%2....的形式; Apache 将其解释为 /get/http:// 并丢失(抛出 404)。有一些方法可以解决这个问题,但你需要访问 Apache 配置 - 我没有。
  • 好的,所以问题与 apache(您之前提供的链接)有关,所以我想您现在被这个肮脏的伎俩困住了。

标签: symfony silex web-testing


【解决方案1】:

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

如何提取url参数示例:

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

【讨论】:

  • 只是为了添加一些信息,我必须将请求作为参数添加到我的控制器操作中。现在工作正常,但我有点抱歉功能签名显示需要 $url :(
猜你喜欢
  • 2012-09-17
  • 2013-04-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-18
相关资源
最近更新 更多