2013-01-04 62 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