2010-10-10 16 views

Respuesta

26

Savant del IRC me ayudó a salir y él sugiere en el uso de beforeRender(){} en el app_controller

// Before Render 
function beforeRender() { 
    if($this->name == 'CakeError') { 
     //$this->layout = 'error'; 
    } 
} 

CakeError es un cajón de sastre para errores: D

+0

Este método ya no es válida con CakePHP 2.x. Y no tengo ni idea de cómo hacerlo ahora ... lol –

+3

Puedo confirmar que este método funciona con Cake 2.2.1. – bancer

+0

No confirmo en Cake 2.2.1. Depuro $ this-> layout beforeRender, obtengo el 'public_layout' esperado, pero todavía se muestra en default.ctp. DEPURAR está establecido en 0. –

4

Esta forma más sencilla que conozco es la creación de esta función en su AppController:

function appError($method, $messages) 
{ 
} 

A continuación, puede hacer lo que quiera con el error, muestran sin embargo que usted quiere, o no mostrarlo en absoluto, enviar un correo electrónico, etc. (no estoy seguro de si este método aún es válido)

También existe la opción de crear app_error.php en la raíz de la aplicación, con class AppError extends ErrorHandler, que le permite anular todo tipo de errores Pero aún no he hecho esto, así que no puedo contarte más sobre eso.

Consulte cake/libs/error.php y cake/libs/object.php y, por supuesto, The Book para obtener más información.

Editar: se olvidó de mencionar, una vez que usted cogió el error, no hay nada que le impida a - por ejemplo - almacenar el error en la sesión, redirigir a su "controlador de gestión de errores", y luego mostrarlo en su controlador sin embargo usted quiere.

+0

muchas gracias: D –

10

mejor crear un archivo en su aplicación error.php carpeta

class AppError extends ErrorHandler { 
    function error404($params) { 
      $this->controller->layout = 'error'; 
      parent::error404($params); 
    } 
} 

para que pueda evitar la prueba si a cada página hacen que la solución de sabios introduce

14

En CakePHP 2.2.2 He cambiado la ExceptionRenderer en core.php con mi propia, así:

app/config/core.php:

Configure::write('Exception', array(
    'handler' => 'ErrorHandler::handleException', 
    'renderer' => 'MyExceptionRenderer', // this is ExceptionRenderer by default 
    'log' => true 
)); 

app/lib/error/MyExceptionRenderer. php:

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

class MyExceptionRenderer extends ExceptionRenderer { 

    protected function _outputMessage($template) { 
    $this->controller->layout = 'error'; 
    parent::_outputMessage($template); 
    } 

} 
+0

No se puede votar lo suficiente, supera mi antiguo enfoque de duplicar cada vista de error y configurar el diseño en 'error' en la parte superior. – Matthew

4

Mi solución para CakePHP 2,3

Cambio t el ExceptionRenderer en core.php para usar tu propio renderizador.

app/config/core.php:

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

app/lib/error/MyExceptionRenderer.php:

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

class MyExceptionRenderer extends ExceptionRenderer 
{ 
    /** 
    * Overrided, to always use a bare controller. 
    * 
    * @param Exception $exception The exception to get a controller for. 
    * @return Controller 
    */ 
    protected function _getController($exception) { 
     if (!$request = Router::getRequest(true)) { 
      $request = new CakeRequest(); 
     } 
     $response = new CakeResponse(array('charset' => Configure::read('App.encoding'))); 
     $controller = new Controller($request, $response); 
     $controller->viewPath = 'Errors'; 
     $controller->layout = 'error'; 
     return $controller; 
    } 
} 

La ventaja de este enfoque es que asegura excepciones emitidas desde AppController no causa un bucle sin fin al representar la excepción. Fuerza una representación básica del mensaje de excepción cada vez.

9

Solo necesita hacer cambios de diseño en su archivo error400.ctp en/app/View/Errors/error400.CTP

Abrir el archivo y configurar la presentación por

<?php $this->layout=''; //set your layout here ?> 
+0

+1 para una solución muy simple. ¡Funciona de maravilla y no requiere casi ningún esfuerzo! (CakePHP 2.4.7) – Hatcham

+0

Esta es la solución correcta. Gracias – Alireza

Cuestiones relacionadas