我可以从环境中自动创建一个 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();