-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 回答