Не удается установить пользовательский код сообщения о статусе в HTTP-ответе с Cake PHP

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

Решение

Прежде всего хотелось бы отметить, что такое требование кажется довольно неудобным. Если ожидается, что ответ будет иметь тело в формате 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;
}

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

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

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

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

$this->response->header($header, $valueOfTheHeader);
Другие вопросы по тегам