Я хочу изменить ответ в методе контроллера. Я понял, как изменить код состояния, но не могу изменить сообщение.
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, но я все еще не знаю, как это сделать.
Прежде всего хотелось бы отметить, что такое требование кажется довольно неудобным. Если ожидается, что ответ будет иметь тело в формате JSON, то пользовательская фраза причины может быть легко определена именно там.
Response::httpCodes()
работает только со «старым» фронт-контроллеромПри этом, как правило, это возможно, но при использовании PSR-совместимых компонентов запроса / ответа, представленных в CakePHP 3.3, это в настоящее время не поддерживается напрямую, так как пользовательские фразы причин не будут переданы в PSR-совместимый ответ. С механизмами диспетчеризации до 3.3 это все еще будет работать, однако, проверьте «старые» шаблоны приложений фронт-контроллера (webroot/index.php
файл).
Начиная с 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 при использовании фронтального контроллера, совместимого с 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;
}
Во-первых, вы указали ссылку на Cake2, а не 3
А для кода состояния 400
код связан с сообщением Bad request
и ты не можешь это изменить.
И заголовки устанавливаются таким образом, где $ header начинается с префикса X-
$this->response->header($header, $valueOfTheHeader);