2

我想在控制器方法中修改响应。我想出了如何更改状态码,但我无法更改消息。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,但我仍然不知道如何去做。

4

2 回答 2

4

首先我想指出,这样的要求似乎相当不方便。如果期望响应具有 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;
}

也可以看看

于 2017-01-25T17:31:15.907 回答
0

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

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

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

$this->response->header($header, $valueOfTheHeader);
于 2017-01-25T16:50:08.267 回答