-1

環境から自動的に作成された HttpRequest を取得できますか? 言い換えれば、今、あなたがしなければならないようです...

$request = new HttpRequest;
$request->setCookies($_COOKIE);
$request->setHeaders(apache_request_headers());
$request->setPostFields($_POST);
$request->setQueryData($_GET);
$request->setRawPostData(file_get_contents('php://input'));
$request->setUrl($_SERVER['REQUEST_URI'']);

$_SERVER['REQUEST_METHOD'] は文字列であり、HttpRequest::setMethod は HTTP_METH_* シリーズの内容で int を取るため、メソッドを設定する必要もあります。したがって、独自のマッピングを設定する必要があります。

HttpRequest を使いたいのですが、今のところ使いづらそうです。何かが足りないことを願っています。


編集:

アイデアは、テストをよりクリーンにすることです。$_COOKIE とその友達はスーパーグローバルです。それをどのようにテストしますか?

function receiveRequest() {
    $code = 'that touches superglobals like' . $_COOKIE['example'];
    $response = new HttpResponse;
    $response->setStatus(200);
    return $response;
}

function testServer() {
    $oldCookie = $_COOKIE;
    $oldPost = $_POST;
    // etc...
    $_COOKIE = array('example' => 'stuff');
    $_POST = array();
    // etc...
    $response = receiveRequest();
    $_COOKIE = $oldCookie;
    $_POST = $oldPost;
    // etc...
    assert($response->getStatus() === 200);
}

使用するもの (この例では $_COOKIE) だけでなく、すべてのスーパーグローバルの状態を制御する必要があります。 約十数あります。 これらすべてを HttpRequest にまとめると、はるかにクリーンになります。

function receiveRequest(HttpRequest $request) {
    $code = 'is purely a function of arguments like' . $request->getCookie('example');
    $response = new HttpResponse;
    $response->setStatus(200);
    return $response;
}

function testServer() {
    $request = new HttpRequest;
    $request->setCookie('example' => 'stuff');
    $response = receiveRequest($request);
    assert($response->getStatus() === 200);
}

次に、実際の server.php は、探している仮想の静的メソッドを使用します。

$request = HttpRequest::generateRequestFromEnvironment($_COOKIE, $_POST, ...);
unset($_COOKIE, $_POST, ...);
$response = receiveRequest($request);
$response->send();
4

2 に答える 2

1

これは私には奇妙な使用例のように思えます - 自分自身に HttpRequest を作成したいですか? 渡されたパラメータを正確に使用していますか? なんで?

通常のケースは、別のホストから別のリソースを要求する場合であり、その場合、希望する種類の「自動セットアップ」はほとんど役に立ちません。この状況が本当に必要な場合、これを簡単に再利用できる関数にラップするのは簡単に思えますか?

于 2009-09-26T15:27:20.630 に答える
1

あなたが投稿したことから、スクリプトをトリガーしたリクエストに関するすべての情報のコンテナーとして HttpRequest を使用していると思います。

これは目的ではなく、スクリプト内から他のサービスへの HTTP リクエストを作成するためのものです。たとえば、Flickr API からデータをリクエストできます。

于 2009-09-26T15:31:27.550 に答える