了解cakephp3错误处理

时间:2015-02-03 22:25:11

标签: error-handling cakephp-3.0

我想通过使用我的AppController“initilize()”方法的子功能检查数据库表中的维护标志来为我的蛋糕网站创建维护页面。如果设置了标志,我会抛出我的自定义MaintenanceException(目前不包含任何特殊内容):

class MaintenanceException extends Exception{

} 

为了处理它,我实现了一个自定义App Exception Renderer:

class AppExceptionRenderer extends ExceptionRenderer {
    public function maintenance($error)
    {
        return "MAINTENANCE";
    }
} 

如果我将我的数据库标志设置为true,我可以在我的网站上看到此维护文本,但我无法在cake的错误处理文档(http://book.cakephp.org/3.0/en/development/errors.html)中找到有关如何实际上告诉Exception渲染器使用模板"maintenance"渲染视图"infopage"

我是否可以在没有自定义错误控制器的情况下使用ExceptionRenderer运行?如果没有,正确的ErrorController实现应该如何?我已经尝试过了:

class AppExceptionRenderer extends ExceptionRenderer {

    protected function _getController(){
        return new ErrorController();
    }

    public function maintenance($error)
    {
        return $this->_getController()->maintenanceAction();
    }

} 

与:

class ErrorController extends Controller {

    public function __construct($request = null, $response = null) {
        parent::__construct($request, $response);
        if (count(Router::extensions()) &&
            !isset($this->RequestHandler)
        ) {
            $this->loadComponent('RequestHandler');
        }
        $eventManager = $this->eventManager();
        if (isset($this->Auth)) {
            $eventManager->detach($this->Auth);
        }
        if (isset($this->Security)) {
            $eventManager->detach($this->Security);
        }
        $this->viewPath = 'Error';
    }

    public function maintenanceAction(){
        return $this->render('maintenance','infopage');
    }

} 

但这只会抛出NullPointerExceptions并导致致命错误。我对蛋糕手册也非常失望,因为那里的代码示例无处可以给我一个关于如何做任何事情以及我实际拥有什么功能的印象。

1 个答案:

答案 0 :(得分:3)

因为今天我有更多的时间,我花了一个小时挖掘蛋糕来源并找到了一个适合我的解决方案(并且可能是它应该做的方式,尽管蛋糕文档并没有真正给出一个提示):

第1步:覆盖_template(...) - 您自己班级中ExceptionRenderer的方法。在我的例子中,我复制了父方法,并在方法的开头添加了以下代码:

$isMaintenanceException = $exception instanceof MaintenanceException;

if($isMaintenanceException){
    $template = 'maintenance';
    return $this->template = $template;
}

这告诉我们的渲染器,名为"maintentance"的错误模板(应该位于Folder:/ Error中)是它应该呈现的错误页面内容。

第2步:我们现在唯一需要做的事情(而且我认为它有点hacky,但是以这种方式提出的蛋糕文档)是在我们的设置中设置布局参数模板到我们想要渲染的基本布局的名称。因此,只需在错误模板上添加以下代码:

$this->layout = "infopage";

我创建的错误控制器实际上甚至不需要这种方法,我仍然不知道蛋糕错误控制器实际上是如何工作的。也许如果我有更多时间,我会深入研究这一点,但目前还是如此。