无法在使用Cake PHP的HTTP响应中设置自定义状态代码消息

时间:2017-01-25 16:16:39

标签: php http cakephp cakephp-3.3

我想修改控制器方法中的响应。我想出了如何更改状态代码,但我无法更改消息。 API表示为httpCodes方法提供一个数组,在该数组中,每个代码都包含我们要设置的消息。这是我的代码:

$this->response->statusCode(400);   
$this->response->httpCodes(array(400 => 'Origin Denied'));
return $this->response;

我得到Bad Request而不是Origin Denied

我还试图像这样直接设置标题:

$this->response->header("HTTP/1.0 500 Invalid file name.");

$this->response->header("HTTP/1.0", "500 Invalid file name.");

但是我得到了

 "HTTP/1.0 500 Invalid file name." is not valid header name : InvalidArgumentException 

我在Cake PHP 3.3和PHP 7.1上。这样做的目的是在我的网站上传媒体并获取带有文件位置的JSON结构,或者如果失败则返回适当的代码。这是TinyMCE的要求。

我是CakePHP和Response类的初学者,我读过这本书和API,但我还是不知道该怎么做。

2 个答案:

答案 0 :(得分:3)

首先,我想指出,这样的要求似乎相当不方便。如果预期响应具有JSON格式的主体,则可以在那里轻松定义自定义原因短语。

Response::httpCodes()仅适用于“旧”前控制器

话虽如此,通常这是可能的,但是当使用CakePHP 3.3引入的PSR兼容请求/响应组件时,目前不直接支持,因为自定义原因短语不会传递给PSR兼容响应。使用3.3之前的调度机制它仍然可以工作,检查“旧”应用程序模板前端控制器(webroot/index.php文件)。

从3.4

开始可以轻松完成

自CakePHP 3.4起,Response::httpCodes()已弃用,将在4.0中删除。从3.4开始,CakePHP响应类将完全兼容PSR-7,您可以通过Response::withStatus()方法设置包含自定义原因短语的状态,例如

return $this->response->withStatus(400, 'Bad Origin');

请记住,PSR-7兼容的响应对象是不可变的!即,如果您希望修改控制器中的$this->response以供进一步使用,则必须覆盖它,例如:

$this->response = $this->response->withStatus(/* ... */);

在3.3 / 3.4过渡中需要“解决方法”

在3.3和3.4之间的转换中,当使用兼容PSR的前端控制器时,您可以通过覆盖Application::__invoke()添加对自定义原因短语的支持(Application类文件默认位于您的应用中src文件夹。

您必须重新实施BaseApplication::__invoke()代码,并传递从Response::httpCodes()获得的原因短语,其中包含以下内容:

use Cake\Http\RequestTransformer;
use Cake\Http\ResponseTransformer;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;

// ...

public function __invoke(ServerRequestInterface $request, ResponseInterface $response, $next)
{
    $cakeRequest = RequestTransformer::toCake($request);
    $cakeResponse = ResponseTransformer::toCake($response);

    $cakeResponse = $this->getDispatcher()->dispatch($cakeRequest, $cakeResponse);

    $psrResponse = ResponseTransformer::toPsr($cakeResponse);

    $status = $psrResponse->getStatusCode();
    $httpCodes = $cakeResponse->httpCodes($status);
    if ($httpCodes !== null && isset($httpCodes[$status])) {
        return $psrResponse->withStatus($status, $httpCodes[$status]);
    }

    return $psrResponse;
}

另见

答案 1 :(得分:0)

首先,您提供的链接是Cake2,而不是3

对于状态代码,400代码与消息Bad request相关联,您无法对其进行更改。

标头以这种方式设置,其中$ header以X-

作为前缀
$this->response->header($header, $valueOfTheHeader);