2012-03-08 22 views

Respuesta

45

Prueba esto:

/app/config/core.php

Excepción render necesidad de establecer como un AppExceptionRender. Ejemplo:

Configure::write('Exception', array(
     'handler' => 'ErrorHandler::handleException', 
     'renderer' => 'AppExceptionRenderer', 
     'log' => true 
)); 

/app/Controller/ErrorsController.php

class ErrorsController extends AppController { 
    public $name = 'Errors'; 

    public function beforeFilter() { 
     parent::beforeFilter(); 
     $this->Auth->allow('error404'); 
    } 

    public function error404() { 
     //$this->layout = 'default'; 
    } 
} 

/app/Lib/Error/AppExceptionRenderer.php

App::uses('ExceptionRenderer', 'Error'); 

class AppExceptionRenderer extends ExceptionRenderer { 

    public function notFound($error) { 
     $this->controller->redirect(array('controller' => 'errors', 'action' => 'error404')); 
    } 
} 

/app/Vista/Errores/error404. ctp

<div class="inner404"> 
    <h2>404 Error - Page Not Found</h2> 
</div> 

Insértelo donde necesite: throw new NotFoundException();

+2

Además, para que esto funcione, debe especificar el representador de excepción como 'AppExceptionRenderer' en el archivo core.php. –

+0

Gracias @JonathanCairns, olvidé mencionar ese matiz. Agregado al ejemplo de código. –

+0

Gracias, esto funciona. Si solo desea personalizar el contenido de su página y no necesita una lógica personalizada, es suficiente omitir la creación de un controlador de errores designado y redireccionar al controlador de páginas en su AppExceptionRenderer. – bfncs

0

Puede crear CustomErrorPages o Exeptions simplemente creando un class de su error que se va a mostrar. Esta clase necesita extenderse CakeExeption. Luego construye tu exeptionlogic y tu conjunto. Ahora puede simplemente throw new <YourExeptionClass>() y se mostrará un error.

Documentación: CakeExceptions

+1

¿Pero cuándo arrojaría ese error para un 404? Quiero decir, ¿cómo se puede personalizar la página 404 de la aplicación ahora? – BadHorsie

38

Para personalizar el contenido de una página de error 404 y no necesita lógica personalizada, simplemente edite los contenidos de app/View/Errors/error400.ctp.

Esto parece no estar documentado correctamente en ninguna parte.

+0

¡Muchas gracias, señor! –

+0

Lanzar una excepción es suficiente para cargar esta página de error - 'throw new NotFoundException();' –

+1

Necesita más votos ascendentes ... tome el mío;) – Karma

4

Crear un diseño con el nombre 404 o cualquier cosa y utilizar en el controlador aplicación

function _setErrorLayout() { 
    if ($this->name == 'CakeError') { 
     $this->layout = '404'; 
    } 
} 
function beforeRender() { 
    $this->_setErrorLayout(); 
} 
6

Si estás buscando solamente usar otra disposición en lugar del predeterminado, sólo tiene que añadir $this->layout = 'your_error_layout'; dentro de su error400.ctp (o cualquier otra página de error que cree en Ver/Errores).

2

La respuesta aceptada no es la mejor opción porque redirigen la url de su navegador a http://example.com.br/error/error404 y el usuario no puede seguir la página que ha cometido para generar este error.

La mejor manera de manejar esta situación es editar el archivo en View/Errors/error400.ctp, por lo que cuando se introduce una URL que no se encuentra como http:example.com/crazy-wrong-url, el navegador va a mantener esta url sino representar el contenido del archivo error400.ctp que edite.

Si desea cambiar la disposición de que la vista se representará puede escribir esto en su vista <?php $this->layout = 'error'; ?>

0

había descubierto hoy que es posible obtener el código en el archivo excpetion CTP usando $error->getCode() (en CakePHP 2.x, al menos).

El $error es donde Cake pone el objeto de excepción ...

Ahora debería poder cambiar el contenido de su vista con un bloque condicional if/else, basado en este valor.

Cuestiones relacionadas