Подтвердить что ты не робот

Как указать код состояния HTTP в Cakephp?

В моем контроллере я проверяю условие, чтобы увидеть, разрешено ли пользователю что-то делать. Если проверка завершилась неудачно, я хочу отправить обратно 403 в браузер. Как это сделать в CakeFp?

4b9b3361

Ответ 1

РЕДАКТИРОВАТЬ - Этот вопрос довольно старый и охватывает различные версии платформы CakePHP. Ниже приводится краткое изложение того, к какой версии относится каждый ответ. Не забудьте проголосовать за решение, которое помогает больше всего.

РЕДАКТИРОВАТЬ # 2 - Mark37 добавил более подробный ответ для CakePHP 2.x.

РЕДАКТИРОВАТЬ # 3 - Добавлено решение для CakePHP. (Май 2018: CakePHP 3.5 сделал переименование некоторых функций, решение от Роберто все еще действует.)


Глядя на соответствующий код API из предыдущего комментария, кажется, что вы можете вызвать Controller :: header ($ status) для вывода заголовка без перенаправления. В вашем случае правильное использование наиболее вероятно:

$this->header('HTTP/1.1 403 Forbidden');

Ответ 2

$this->response->statusCode(403);

Будет установлен код состояния, когда Cake готов отправить ответ. CakeResponse:: send() ожидает отправки кода состояния и сообщения, поэтому в моих тестах, я думаю, что использование header() было перезаписано. использование $this->header('HTTP/1.1 400 Bad Request') не работает либо потому, что Cake ожидает, что любой вызов $this->header будет разбит на двоеточие ex: $this->header('Location: ...')

Ответ 4

Я добавляю в свои два цента здесь, потому что я не чувствую, что любой из этих ответов охватывал эту тему так же тщательно, как мне бы хотелось (по крайней мере, для Cake 2.x).

Если вы хотите сбросить статус ошибки, используйте классы Exception (как указано в других ответах):

throw new BadRequestException(); // 400 Bad Request

// Or customize the code...
throw new BadRequestException('Custom error message', 405); // 405 Method Not Allowed

Забавный факт: Cake автоматически выполнит некоторые магические ошибки даже для вызовов RESTful через класс ExceptionRenderer. Еще большее удовольствие от факта состоит в том, что он основан на Кодексе состояния, а не на том, что может быть выброшен Exception, поэтому, если вы установите код состояния > 400 самостоятельно, вы вероятно, получите сообщения об ошибках, даже если вы их не хотели.

Если вы хотите вернуть конкретный код состояния для конечной точки REST JSON/XML, воспользуйтесь новым объектом CakeResponse, но также убедитесь, что вы добавили специальную переменную _serialize, или вы закончите с ошибка 'view not found', так как торт попытается найти представление для рендеринга вашего JSON/XML. (Это по дизайну - см. Класс JsonView/XmlView.)

$this->response->setStatus(201);  // 201 Created
$this->set('_serialize', array()); // Value must be something other than null

И, наконец, если вы хотите отправить статус не-200 для регулярно отображаемой страницы, вы можете просто использовать метод setStatus() ни с чем другим, как указано в предыдущем ответе:

$this->response->setStatus(201);

UPDATE:

$this->response->setStatus('code');

больше не доступен. Используйте

$this->response->statusCode('code');

Ответ 5

Пересмотрев этот вопрос и прочитав Adriano, комментарий к моему предыдущему ответу (относительно перенаправления пользователя на дружественную страницу), я придумал новое решение.

Внутри контроллера вы можете вызвать $this->cakeError('error404'), чтобы создать дружественную страницу 404. Это можно настроить (как и с другими ошибками), создав файл в app/views/errors/error404.ctp.

После более подробного изучения кода для cakeError моя рекомендация состоит в том, чтобы попытаться расширить Cake ErrorHandler, создав файл на 'app/error.php' или (возможно, более предпочтительно) 'app/app_error.php'.

Код для вашего error403 (подражание error404 code) можно прочитать следующим образом:

class AppError extends ErrorHandler {
    function error403($params) {
        extract($params, EXTR_OVERWRITE);
        $this->error(array(
            'code' => '403',
            'name' => 'Forbidden',
            'message' => sprintf(__("Access was forbidden to the requested address %s on this server.", true), $url, $message)));
            $this->_stop();
     }
}

Вы также можете предоставить пользовательский вид этой ошибки, создав "app/views/errors/error403.ctp". Вот измененная версия error404 view:

<h2><?php echo $name; ?></h2>
<p class="error">
    <strong>Error: </strong>
    <?php echo sprintf(__("Access was forbidden to the requested address %s on this server.", true), "<strong>'{$message}'</strong>")?>
</p>

Ответ 6

Заметки о CakePHP 3.x отсутствуют, поэтому для завершения этой темы:

Для использования CakePHP 3.x:

$response = $this->response->withStatus(403);
return $response;

Для версий до CakePHP 3.3.x вы можете использовать тот же стиль, что и CakePHP 2.x:

$this->response->statusCode('code');

Обратите внимание, что использование функции PHP напрямую также работает (http_response_code(403); die();), хотя использование объекта ответа похоже на предполагаемый метод.

Ответ 7

Возможно, что-то в этом разделе руководства cakephp может вам помочь.

redirect (строка $url, целочисленный $status, boolean $exit)

Метод управления потоком, который вы используете чаще всего это перенаправление(). Этот метод принимает первый параметр в виде относительного URL-адреса CakePHP. Когда пользователь успешно разместил заказ, вы возможно, пожелают перенаправить их на получение экран. Второй параметр перенаправления() позволяет определить Код состояния HTTP для сопровождения перенаправления. Вы можете использовать 301 (постоянно перемещается) или 303 (см. другое), в зависимости от характера перенаправление.

Метод выдаст exit() после перенаправление, если вы не установите третий параметр false.

Ответ 8

Вы можете использовать cakephp response для настраиваемого сообщения:

$this->response->header('HTTP/1.0 201', 'custom message');
$this->response->send();