2012-03-08 6 views
30

Я прочитал, что класс AppError теперь имеет обратную совместимость и что вместо этого следует использовать Исключения. Как можно создавать собственные страницы ошибок для таких вещей, как ошибки 404 или полностью пользовательские ошибки?CakePHP 2.0 - Как создать пользовательские страницы ошибок?

ответ

45

Попробуйте это:

/app/config/core.php

Исключение делают необходимость установить в качестве AppExceptionRender. Пример:

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

/приложение/View/Ошибки/error404. ctp

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

Вставьте его там, где вам нужно: throw new NotFoundException();

+2

Кроме того, чтобы заставить это работать, вам нужно указать средство визуализации Exception как «AppExceptionRenderer» в файле core.php. –

+0

Спасибо @ JonathanCairns, я забыл упомянуть об этом нюансе. Добавлен пример кода. –

+0

Спасибо, это работает. Если вы хотите только настроить содержимое своей страницы и не нуждаетесь в пользовательской логике, достаточно опустить создание назначенного контроллера erros и перенаправить на страницу-контроллер в свой AppExceptionRenderer. – bfncs

0

Вы можете создать CustomErrorPages или Exeptions, создав объект в своем объявлении class. Этот класс должен распространяться на CakeExeption. Затем создайте свой exeptionlogic и ваш набор. Теперь вы можете просто throw new <YourExeptionClass>(), и на экране отобразится ошибка.

Документация: CakeExceptions

+1

Но когда бы я выбрал эту ошибку для 404? Я имею в виду, как настроить страницу приложения на 404 сейчас? – BadHorsie

38

Чтобы настроить содержимое страницы с ошибкой 404 и не нужно настраивать логику, просто отредактируйте содержимое app/View/Errors/error400.ctp.

Это, кажется, нигде не задокументировано.

+0

Спасибо, сэр! –

+0

Для того, чтобы загрузить эту страницу с ошибкой, достаточно выбросить ошибку - 'throw new NotFoundException();' –

+1

Вам нужно больше upvotes .. take mine;) – Karma

4

Создание макета с именем 404 или что-то и использовать в контроллере

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

приложение Если вы только хотите использовать другую раскладку вместо стандартного, просто добавьте $this->layout = 'your_error_layout'; внутри error400.ctp (или любую другую страницу ошибок, которую вы создаете в разделе «Просмотр/ошибки»).

2

Принимаемый ответ не самый лучший вариант, поскольку они перенаправляют URL-адрес вашего браузера на http://example.com.br/error/error404, и пользователь не может следить за тем, какую страницу он ввел для создания этой ошибки.

Лучший способ справиться с этой ситуацией является редактирование файла на View/Errors/error400.ctp, поэтому, когда вы вводите не найден URL, как http:example.com/crazy-wrong-url, браузер будет держать этот адрес, но делают содержимое error400.ctp файла, который вы редактируете.

Если вы хотите изменить расположение, что вид будет оказано вы можете напечатать это на ваш взгляд <?php $this->layout = 'error'; ?>

0

обнаружил сегодня, что можно получить код excpetion в файле CTP с использованием $error->getCode() (в CakePHP 2.x, как минимум).

$error был Cake помещает объект исключения ...

Теперь вы должны иметь возможность изменять содержимое своего вида с помощью условного блока if/else, основанного на этом значении.

Смежные вопросы