是否可以在错误页面中显示默认布局?

Is it possible to show default layout in error pages?

我想从头开始设计我的应用程序样式,所以我创建了一个全新的布局并将其指定为默认布局:

class AppController extends Controller {

    public $components = array(
        'DebugKit.Toolbar',
    );

    public function beforeRender() {
        parent::beforeRender();

        $this->layout = 'app';
    }
}

不过好像也影响了我开发需要的CakePHP生成的内部错误页面:

有没有办法让这样的页面使用 app\View\Layouts\default.ctp 而不是 app.ctp

您可以通过创建自定义异常渲染器来做到这一点:-

// app/Lib/Error/AppExceptionRenderer.php
class AppExceptionRenderer extends ExceptionRenderer {

    public function render() {
        $this->controller->layout = 'default';
        parent::render();
    }

}

然后在 app/Config/core.php 中确保你告诉 Cake 使用你的 AppExceptionRenderer class 来处理异常:-

Configure::write('Exception', array(
    'handler' => 'ErrorHandler::handleException',
    'renderer' => 'AppExceptionRenderer',
    'log' => true
));

使用自定义异常渲染器可以让您更灵活地处理应用中的异常。

最后,将自定义布局定义从 \AppController::beforeRender 移动到 \AppController::beforeFilter,以便它运行得更早,并且可以在出现错误时被覆盖:

class AppController extends Controller {
    public function beforeFilter() {
        parent::beforeFilter();
        $this->layout = 'app';
    }
}