Подтвердить что ты не робот

CakePHP 2.0 - Как создать пользовательские страницы ошибок?

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

4b9b3361

Ответ 1

Попробуйте следующее:

/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();

Ответ 2

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

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

Ответ 3

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

Ответ 4

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

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

Ответ 5

Принятый ответ не самый лучший вариант, поскольку они перенаправляют 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'; ?>

Ответ 6

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

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

Ответ 7

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

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

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