0

私はこの新しいZendFrameworkリリースを扱っています。マニュアルページに見られるように、POSTコンテンツtoString()が返されることを期待しています。

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 Framework 2は、によってベンダーとしてインストールされcomposerますrequire "zendframework/zend-http": "2.0.6"PHP 5.4.9との両方PHP 5.3.10

それはバグですか、それとも私は何かが恋しいですか?

ありがとう。

4

1 に答える 1

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());
    }
}

$request をエコーすると、次のように出力されます。

POST /foo HTTP/1.1

foo=bar;bar=foo

メソッドの命名、ドキュメント、および使用目的は混乱を招きます。フォーム フィールドは、生の文字列またはオブジェクト パラメータとして格納できます。メソッドRequest::toString()は、両方のケースを適切に処理しません。

文字列からRequestオブジェクトを作成する場合、フォーム フィールドはRequest::setContent()メソッドを使用して生の文字列として保存されます。メソッドRequest::toString()を呼び出すと、メソッドRequest ::getContent()が呼び出され、Requestオブジェクトの文字列表現が作成されます。

フォーム フィールドをオブジェクトとして保持したい場合は、Requestオブジェクトの文字列表現を自分で作成する必要があります。

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 勧告 - B.2.2 URI 属性値のアンパサンドを参照してください。

于 2013-01-05T03:03:21.920 に答える