CakePHP 2.0 - Как сделать пользовательские страницы ошибок? - PullRequest
31 голосов
/ 08 марта 2012

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

Ответы [ 7 ]

46 голосов
/ 30 апреля 2012

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

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

/ app /View / Errors / error404.ctp

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

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

40 голосов
/ 10 сентября 2012

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

Кажется, это нигде не задокументировано должным образом.

7 голосов
/ 27 июня 2013

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

5 голосов
/ 26 января 2013

Создайте макет с именем 404 или что-нибудь еще и используйте в контроллере приложения

function _setErrorLayout() {
    if ($this->name == 'CakeError') { 
        $this->layout = '404';
    }
}
function beforeRender () {
    $this->_setErrorLayout();
}
2 голосов
/ 18 июля 2014

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

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

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

0 голосов
/ 01 ноября 2014

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

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

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

0 голосов
/ 10 апреля 2012

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

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

...