CakePHP 2.0 - 如何制作自定义错误页面?

时间:2012-03-08 15:39:24

标签: php cakephp http-status-code-404 cakephp-2.0

我读到AppError类现在是为了向后兼容,应该使用Exceptions。如何为404错误或完全自定义错误等内容创建自定义错误页面?

7 个答案:

答案 0 :(得分:46)

试试这个:

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

答案 1 :(得分:40)

要自定义404错误页面的内容而不需要自定义逻辑,只需编辑app/View/Errors/error400.ctp的内容。

这似乎没有在任何地方正确记录。

答案 2 :(得分:7)

如果你只想使用其他版面而不是默认,只需在error400.ctp(或在View / Errors下创建的任何其他错误页面)中添加$this->layout = 'your_error_layout';

答案 3 :(得分:5)

创建名称为404或任何内容的布局,并在app controller中使用

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

答案 4 :(得分:2)

接受的答案不是最佳选择,因为他们会将浏览器的网址重定向到http://example.com.br/error/error404,并且用户无法按照他输入的页面生成此错误。

处理这种情况的更好方法是View/Errors/error400.ctp上的编辑文件,因此当您输入一个未找到的网址http:example.com/crazy-wrong-url时,浏览器会保留此网址但会呈现{{1}的内容您编辑的文件。

如果您想更改视图将呈现的布局,您可以在视图中输入error400.ctp

答案 5 :(得分:0)

您只需创建要显示的错误的CustomErrorPages即可创建Exeptionsclass。这个类需要扩展CakeExeption。然后构建你的exeptionlogic和你的集合。现在你只能throw new <YourExeptionClass>(),它会显示错误。

文档:CakeExceptions

答案 6 :(得分:0)

今天发现可以使用$error->getCode()在ctp文件中获取激活码(至少在CakePHP 2.x中)。

$error是Cake放置异常对象......

现在,您应该可以使用基于此值的if/else条件块更改视图的内容。