【问题标题】:Custom layout for ALL errors in CakePHP 2.1CakePHP 2.1 中所有错误的自定义布局
【发布时间】:2015-06-09 10:22:39
【问题描述】:

如何在 CakePHP 2.1 中为我的错误使用自定义布局?

我浏览了文档并看到了自定义处理程序等的各种提及,但在选择要使用的布局方面却一无所获……有什么想法吗?

在像 1.3 之前的 CakePHP 版本中,您可以创建一个 AppError 类,但这将不再起作用,因为现在 CakeError 已被贬低,并且根据新应用程序的文档,这样做会受到蔑视。

【问题讨论】:

    标签: php cakephp


    【解决方案1】:

    您可以在 beforeRender() 函数中更改布局,如下所示:-

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

    【讨论】:

      【解决方案2】:

      这就是我在 CakePHP 2.2.2 中所做的:我更改了 core.php 中的异常渲染器并扩展了 ExceptionRenderer,其中 MyExceptionRenderer 仅覆盖了父方法之一。该发行版已经包含文件 app/View/Layouts/error.ctp 所以我只是稍微编辑了一下。

      我还注意到 CakeError 已被弃用,所以这对我有用。

      app/Config/core.php:

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

      app/Lib/Error/MyExceptionRenderer.php:

      App::uses('ExceptionRenderer', 'Error');
      
      class MyExceptionRenderer extends ExceptionRenderer {
      
        protected function _outputMessage($template) {
          $this->controller->layout = 'error';
          parent::_outputMessage($template);
        }
      
      }
      

      【讨论】:

        【解决方案3】:

        在 core.php 中,我将错误处理程序和异常处理程序切换为自定义处理程序:

        App::uses('MyErrorHandler', 'Tools.Error');
        Configure::write('Error', array(
            'handler' => 'MyErrorHandler::handleError',
            'level' => E_ALL & ~E_DEPRECATED & ~E_STRICT,
            'trace' => true
        ));
        
        Configure::write('Exception', array(
            'handler' => 'MyErrorHandler::handleException',
            'renderer' => 'Tools.MyExceptionRenderer',
            'log' => true
        ));
        

        那么你应该把你的类放在Lib/Error/(插件或不)

        示例:https://github.com/dereuromark/tools/tree/2.0/Lib/Error

        【讨论】:

        • 我只想改变布局 O_o 我真的需要写所有代码吗???
        • 哦,我以为你想做更多......好吧,对于布局,可能会有更简单的解决方案 - 例如在 AppController beforeRender 中(检查 Controller == Error)。
        • 我想我在 1.3 中使用过这个:if ($this->name == 'Error') { // switch layout with $this->layout = 'some' }
        【解决方案4】:

        随便写

        $this->layout = 'my_error' 
        

        在您的 error400.ctp 和 error500.ctp 文件中

        在您的视图/Errors/404.ctp 视图/Errors/500.ctp

        喜欢这个

        <?php $this->layout = 'my_error' ?>
        <!doctype html>
        <html>
        <head>
        </head>
        <body>
        </body>
        </html>
        

        @faferuziel / @fetruzie 最好的问候

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-12-16
          • 2013-08-29
          • 2016-11-09
          • 1970-01-01
          • 1970-01-01
          • 2012-12-01
          相关资源
          最近更新 更多