2013-01-04 131 views
0

我正在处理这个新的 Zend Framework版本。正如manual页面看到,我希望回到toString()POST内容:Zend Http Request失败toString()post的值

use Zend\Http\Request; 

class RequestTest extends \PHPUnit_Framework_TestCase 
{ 
    public function testARequestWithAPostValue() 
    { 
     $request = new Request(); 
     $request->setMethod(Request::METHOD_POST); 
     $request->setUri('/foo'); 
     $request->getPost()->set('foo', 'bar'); 

     $string = "POST /foo HTTP/1.1\r\n\r\nfoo=bar&"; 
     $this->assertEquals($string, $request->toString()); 
    } 
} 

但该地区似乎是空的:

1) RequestTest::testRequestWithAPostValue 
Failed asserting that two strings are equal. 
--- Expected 
+++ Actual 
@@ @@ 
'POST /foo HTTP/1.1 

-foo=bar&' 
+' 

Zend框架2安装作为卖方通过composerrequire "zendframework/zend-http": "2.0.6"。在PHP 5.4.9PHP 5.3.10

这是一个错误或我想念什么?

谢谢。

回答

0

很难说它是否是一个错误。但是,行为似乎不一致或者至少不直观。下面是样品,你预计将工作:

use Zend\Http\Request; 

class RequestTest extends \PHPUnit_Framework_TestCase 
{ 
    public function testARequestWithAPostValue() 
    { 
     $string = "POST /foo HTTP/1.1\r\n\r\nfoo=bar;bar=foo"; 
     $request = Request::fromString($string); 

     $this->assertEquals($string, $request->toString()); 
    } 
} 

呼应$请求将输出:

POST /foo HTTP/1.1 

foo=bar;bar=foo 

方法命名,文档和使用目的是迷惑:表单字段可以存储作为原料字符串或作为对象参数。方法Request :: toString()不能优雅地处理这两种情况。

当创建从一个刺表单字段将被存储为使用该方法支持:: setContent()原始字符串的请求对象。当调用方法Request :: toString()方法将调用Request :: getContent(),同时组成请求对象的字符串表示形式;

如果您希望将表单字段保留为对象,则必须自己创建请求对象的字符串表示形式。

use Zend\Http\Request; 
use Zend\Stdlib\Parameters; 

class RequestTest extends \PHPUnit_Framework_TestCase 
{ 
    public function testARequestWithAPostValue() 
    { 
     $request = new Request(); 
     $request->setMethod(Request::METHOD_POST); 
     $request->setUri('/foo'); 
     $params = new Parameters(); 
     $params->set('foo', 'bar'); 
     $params->set('bar', 'foo'); 
     $request->setPost($params); 

     $str = $request->renderRequestLine() . "\r\n"; 
     $headers = $request->getHeaders(); 
     if (!empty($headers)): 
      $str .= $headers->toString(); 
     endif; 
     $str .= "\r\n"; 

     $rawData = ''; 
     $keys = array_keys($params->toArray()); 
     foreach ($keys as $name) : 
      $rawData .= "$name=" . $request->getPost($name) . ";"; 
     endforeach; 
     $str .= substr($rawData, 0, -1); 

     $string = "POST /foo HTTP/1.1\r\n\r\nfoo=bar;bar=foo"; 
     $this->assertEquals($string, $str); 
    } 
} 

请注意,最后一个表单字段键值对之后没有分隔符。

使用“&”字符分隔表单域被认为是不好的做法。请参阅W3C Recommendations - B.2.2 Ampersands in URI attribute values