【发布时间】:2009-09-26 15:24:20
【问题描述】:
我可以从环境中自动创建一个 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();
【问题讨论】:
标签: php httprequest