Cakephp 2.x自定义异常渲染

时间:2013-10-16 09:38:37

标签: php cakephp exception-handling error-handling

到目前为止,我所拥有的是:

应用/配置/ core.php中

Configure::write('debug', 2);

应用/配置/ bootstrap.php中

CakePlugin::loadAll(array('bootstrap' => true));

应用/插件/核心/ bootstrap.php中

Configure::write('Exception.renderer', 'Core.AppExceptionRenderer');

应用/插件/核心/ LIB /错误/ AppExceptionRenderer.php

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

class AppExceptionRenderer extends ExceptionRenderer {

    public function notFound($error) {
        echo $error->getMessage();
    }

    public function missingController($error) {
        echo $error->getMessage();
    }
}

那些简单的回声起作用。

现在我希望每个错误函数都呈现(不是重定向!)来自Core插件的视图,例如app/Plugin/Core/View/Pages/error

我不想呈现静态页面(例如/Errors/error400.ctp),因为用户可以从管理面板编辑错误页面的内容。

错误页面布局应在名为Default的主题中设置。

http://book.cakephp.org/2.0/en/development/exceptions.html

2 个答案:

答案 0 :(得分:1)

我想这就是你要做的,设置布局&视图在beforeFilter方法中呈现 -

class AppExceptionRenderer extends ExceptionRenderer {
    public function beforeFilter() {
        $this->layout = 'YOUR_LAYOUT'; // Setting the default layout to your layout
        $this->view   = '../../Plugin/Core/View/Pages/error'; //Check this path to your ctp file
    }
...
...
}

答案 1 :(得分:0)

您可以像这样设置自定义错误的视图

应用/插件/核心/ LIB /错误/ AppExceptionRenderer.php

<?php

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

class AppExceptionRenderer extends ExceptionRenderer {

    public function notFound($error) {
         $this->controller->redirect(array('controller' => 'custom_errors', 'action' => 'not_found'));
    }

    public function missingController($error) {
         $this->controller->redirect(array('controller' => 'custom_errors', 'action' => 'missing_controller'));
    }
}

应用/控制器/ CustomErrorsController.php

<?php
App::uses('Controller', 'Controller');

class CustomErrorsController extends Controller {

    public function beforeFilter(){

    }

    public function not_found(){
        // your coding goes here.

    }

    public function missing_controller(){
        // your coding goes here.

    }
}

您可以指定操作的视图。