tutorial español ejemplos cakephp

español - ¿Cómo se especifica un código de estado HTTP en Cakephp?



cakephp tutorial (8)

Al revisar esta pregunta, y al leer el comentario de Adriano sobre mi respuesta anterior (con respecto a redirigir al usuario a una página amigable), se me ocurrió una nueva solución.

Dentro de un controlador puede llamar $this->cakeError(''error404'') para generar una página amigable 404. Esto se puede personalizar (como con otros errores) creando un archivo en '' app/views/errors/error404.ctp ''.

Después de echar un vistazo más de cerca al código de cakeError , mi recomendación es intentar extender Cake''s ErrorHandler creando un archivo en '' app/error.php '' o (posiblemente más preferible) '' app/app_error.php ''.

El código para su error403 (que imita el código error404 ) podría leerse de la siguiente manera:

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(); } }

También debería poder proporcionar una vista personalizada para este error creando '' app/views/errors/error403.ctp ''. Aquí hay una versión modificada de la vista 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>

En mi controlador, verifico una condición para ver si el usuario puede hacer algo. Si la verificación falla, quiero enviar un 403 de vuelta al navegador. ¿Cómo hago eso en Cakephp?



Estoy agregando mis dos centavos aquí porque no creo que ninguna de estas respuestas cubriera este tema tan exhaustivamente como me hubiera gustado (al menos para Cake 2.x).

Si desea arrojar un estado de error, use las clases de excepción (como se menciona en otras respuestas):

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

Dato curioso : Cake realizará automáticamente algunas representaciones de errores mágicos incluso para llamadas RESTful a través de la clase ExceptionRenderer . Lo más divertido es que se basa en el Código de estado , no en el hecho de que se haya lanzado una Exception , por lo que si configuras el código de estado a> 400 por tu cuenta, es probable que recibas mensajes de error incluso si no lo hiciste. los quiero

Si desea devolver un código de estado específico para un punto final REST JSON / XML, aproveche el nuevo objeto CakeResponse , pero también asegúrese de agregar la variable especial _serialize o terminará con un error de ''ver no encontrado'' como cake intentará encontrar una vista para renderizar su JSON / XML. (Esto es por diseño: consulte la clase JsonView / XmlView ).

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

Y, por último, si desea enviar un estado que no sea 200 para una página renderizada con regularidad, puede simplemente usar el método setStatus() sin otra cosa que la mencionada en una respuesta anterior:

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

ACTUALIZAR:

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

ya no está disponible. Utilizar

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


Las notas sobre CakePHP 3.x parecen faltar, así que para completar este hilo:

Para el uso de CakePHP 3.x:

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

Para las versiones anteriores a CakePHP 3.3.x puede usar el mismo estilo que CakePHP 2.x:

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

Tenga en cuenta que el uso de la función PHP directamente también funciona ( http_response_code(403); die(); ), aunque el uso del objeto de respuesta parece ser el método previsto.


Puede usar la response cakephp para mensajes personalizados:

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


Tal vez algo en esta sección del manual cakephp puede ayudarte.

redirigir (string $ url, entero $ status, boolean $ exit)

El método de control de flujo que usará con mayor frecuencia es redirigir (). Este método toma su primer parámetro en forma de una URL relativa a CakePHP. Cuando un usuario ha realizado un pedido con éxito, es posible que desee redirigirlo a una pantalla de recibo. El segundo parámetro de redirect () le permite definir un código de estado HTTP para acompañar a la redirección. Puede usar 301 (movido permanentemente) o 303 (ver otro), dependiendo de la naturaleza de la redirección.

El método emitirá una salida () después de la redirección a menos que establezca el tercer parámetro en falso.


EDITAR : esta pregunta es bastante antigua y cubre diferentes versiones del marco de CakePHP. A continuación se muestra un resumen de a qué versión se aplica cada respuesta. No olvide votar sobre la solución que más ayuda.

  • CakePHP 3.x - utilizando el objeto de respuesta ( respuesta de Roberto )
  • CakePHP 2.x: uso de excepciones ( respuesta de Brad Koch ) [solución preferida]
  • CakePHP 2.x: configuración del encabezado únicamente ( respuesta de Asa Ayers )
  • CakePHP 1.x - usando el manejador de errores ( mi otra respuesta )
  • CakePHP 1.x - configuración del encabezado solamente (esta respuesta)

EDIT # 2 : Mark37 ha agregado una respuesta más detallada para CakePHP 2.x.

EDIT # 3 - Solución agregada para CakePHP. (Mayo de 2018: CakePHP 3.5 hizo un cambio de nombre de función, la solución de Roberto sigue siendo válida).

Al mirar el código API relevante del comentario anterior, parece que puede llamar a Controller::header($status) para generar un encabezado sin redirección. En su caso, el uso correcto es más probable:

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


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

Establecerá el código de estado cuando Cake esté listo para enviar la respuesta. CakeResponse :: send () espera enviar el código de estado y el mensaje, por lo que en mis pruebas creo que mi header() fue sobrescrito. El uso de $this->header(''HTTP/1.1 400 Bad Request'') tampoco funciona porque Cake espera que cualquier llamada a $this->header se divida en dos puntos: $this->header(''Location: ...'')