Не удается установить сообщение с кодом пользовательского статуса в ответе HTTP с переполнением стека тортов

Я хочу изменить ответ в методе контроллера. Я понял, как изменить код состояния, но не могу изменить сообщение.
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, но я все еще не знаю, как это сделать.

0

Решение

Прежде всего хотелось бы отметить, что такое требование кажется довольно неудобным. Если ожидается, что ответ будет иметь тело в формате JSON, то пользовательская фраза причины может быть легко определена именно там.

Response::httpCodes() работает только со «старым» фронт-контроллером

При этом, как правило, это возможно, но при использовании PSR-совместимых компонентов запроса / ответа, представленных в CakePHP 3.3, это в настоящее время не поддерживается напрямую, так как пользовательские фразы причин не будут переданы в 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;
}

Смотрите также

2

Другие решения

Во-первых, вы указали ссылку на Cake2, а не 3

А для кода состояния 400 код связан с сообщением Bad request и ты не можешь это изменить.

И заголовки устанавливаются таким образом, где $ header начинается с префикса X-

$this->response->header($header, $valueOfTheHeader);
0

По вопросам рекламы [email protected]