ZF2,将数组作为查询参数传递,尤其是Zend \ Http \ Request

时间:2015-02-01 01:40:50

标签: php zend-framework2

问题:

任何人都知道如何将Zend \ Http \ Request(或者可能是在Zend \ Stdlib \ ParametersInterface的实现者中)哄骗到创建url,其中数组查询arg键不包含索引。

背景:

我正在尝试使用Zend \ Http \ Request对象在GET请求上传递一个值数组作为查询参数。

...
$httpClient = new Zend\Http\Client(); // cURL adapter setup omitted
$request = new Zend\Http\Request();  // set url, set GET method omitted

$myQueryArgArray = [ 
    'key0' => 'val0',
    'key1' => ['val1', 'val2'],
];
$request->getQuery()->fromArray($myQueryArgArray);

$response = $httpClient->send($request);
...

cURL适配器正在向门外发送一个如下所示的网址:

hostname/path?key0=val0&key1%5B0%5D=val1&key1%5B1%5D=val2

没有编码:

hostname/path/?key0=val0&key1[0]=val1&key1[1]=val2

但是,除非我在查询字符串中 NOT 传递索引,否则我调用的服务器将失败。也就是说,在URL编码之前,我可以使用以下网址调用我的API端点:

hostname/path?key0=val0&key1[]=val1&key1[]=val2

问题(再次:):

任何人都知道如何将Zend \ Http \ Request(或者可能是在Zend \ Stdlib \ ParametersInterface的实现者中)哄骗到创建url,其中数组查询arg键不包含索引。

我尝试了什么:

我已经尝试将我的数组包装在Zend \ Stdlib \ ArrayObject中:

...
$myQueryArgArray = [ 
    'key0' => 'val0',
    'key1' => new \Zend\StdLib\ArrayObject(['val1', 'val2']),
];
...
唉,无济于事。

我知道我通过手动构建查询字符串并将其直接交给Zend \ Http \ Request对象来实现目标,但我正在寻找一种比创建自己的查询字符串更好的方法。

这个页面似乎表明没有标准,所以我认为ZF2和我的api端点都没有做错:
How to pass an array within a query string?

1 个答案:

答案 0 :(得分:2)

我查看了来源,问题不是Zend\Http\Request类,而是Zend\Http\Client

看看line 843您看到了对http_build_query功能的调用。在php.net网站上,您可以在评论中找到解决方案:

$query = http_build_query($query);
$query = preg_replace('/%5B[0-9]+%5D/simU', '%5B%5D', $query);

所以最干净的解决方案可能是扩展Zend\Http\Client类并覆盖send方法。