2010-10-10 1 views

ответ

26

Савант из IRC помог мне, и он предложить в использовании beforeRender(){} в app_controller

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

CakeError является Catchall ошибок: D

+0

Этот метод больше не действует с CakePHP 2.x. И я понятия не имею, как это сделать сейчас ... lol –

+3

Я могу подтвердить, что этот метод работает с Cake 2.2.1. – bancer

+0

Я не подтверждаю в пироге 2.2.1. Я отлаживаю $ this-> layout внутри beforeRender, я получаю ожидаемый «public_layout», но он по-прежнему отображается в default.ctp. DEBUG установлен в 0. –

4

Это самый простой способ я знаю, чтобы создать эту функцию в AppController:

function appError($method, $messages) 
{ 
} 

Вы можете делать все, что вы хотите с ошибкой, показать его, как вам нравится, или не отображать его на всех, отправьте электронное письмо и т. д. (я не уверен, если этот метод, если он все еще действителен.)

Существует также возможность создания app_error.php в корне вашего приложения с class AppError extends ErrorHandler, в котором вы можете переопределить все виды ошибки. Но я еще этого не сделал, поэтому больше не могу рассказать об этом.

См. cake/libs/error.php и cake/libs/object.php и, конечно, The Book для получения дополнительной информации.

Редактировать: Запомнилось, что после того, как вы поймали ошибку, вам нечего мешать - например, сохранить ошибку в сеансе, перенаправить на ваш «контроллер обработки ошибок», а затем отобразить его на контроллере вы хотите.

+0

Большое спасибо: D –

10

лучше создать файл error.php в приложении папка

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

так что вы можете избежать, если тестирование на каждой странице делают это решение Savants' представляет

14

В CakePHP 2.2.2 я изменил ExceptionRenderer в core.php с моим собственным, например:

приложение/Config/core.php:

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

приложение/Lib/Error/MyExceptionRenderer. PHP:

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

class MyExceptionRenderer extends ExceptionRenderer { 

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

} 
+0

Невозможно выдвинуть это достаточно, бьет мой старый подход, дублируя каждое представление ошибки и устанавливая макет 'error' вверху. – Matthew

4

Мое решение для CakePHP 2,3

Ch ange ExceptionRenderer в core.php для использования вашего собственного средства визуализации.

приложение/Config/core.php:

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

приложение/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; 
    } 
} 

Преимущество этого подхода заключается в том, что она обеспечивает любые исключения, из AppController не вызывайте бесконечный цикл при выполнении исключения. Заставляет базовую визуализацию сообщения об исключениях каждый раз.

9

Просто вам нужно внести изменения в файл error400.ctp в/app/View/Errors/error400.не CTP

Открыть этот файл и установить расположение по

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

+1 для очень простого решения. Делает удовольствие и почти не прилагает усилий! (CakePHP 2.4.7) – Hatcham

+0

Это правильное решение. благодаря – Alireza