Как указать код статуса HTTP в Cakephp? - PullRequest
27 голосов
/ 09 июля 2009

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

Ответы [ 9 ]

39 голосов
/ 09 июля 2009

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

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

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


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

$this->header('HTTP/1.1 403 Forbidden');
13 голосов
/ 05 октября 2012

В CakePHP 2 предпочтительный метод заключается в генерации исключения :

throw new ForbiddenException();
13 голосов
/ 13 июля 2012
$this->response->statusCode(403);

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

10 голосов
/ 24 декабря 2013

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

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

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, иначе вы получите ошибка «представление не найдено», так как торт попытается найти представление для визуализации вашего 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');
7 голосов
/ 02 августа 2009

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

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

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

Код для error403 (имитирующий код error404 ) может выглядеть следующим образом:

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 :

<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 голосов
/ 17 июня 2017

Примечания, касающиеся 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();), хотя использование объекта ответа выглядит как предполагаемый метод.

3 голосов
/ 09 июля 2009

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

редирект (строка $ url, целое число $ status, логический $ выход)

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

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

1 голос
/ 17 января 2019

С CakePHP 3.6 снова изменилось:

Использовать сейчас

    $this->setResponse($this->response->withStatus(403) );
    return $this->response; // use this line also 

вместо

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

https://api.cakephp.org/3.7/class-Cake.Controller.Controller.html#_setResponse

1 голос
/ 06 апреля 2016

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

$this->response->header('HTTP/1.0 201', 'custom message');
$this->response->send();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...