【问题标题】:Cakephp - how to make error pages have its own layouts?Cakephp - 如何让错误页面有自己的布局?
【发布时间】:2011-04-23 09:12:51
【问题描述】:

我想为找不到 404 页面的页面设置不同的布局。如何为该页面设置不同的布局?

【问题讨论】:

    标签: cakephp cakephp-1.3


    【解决方案1】:

    来自 IRC 的 Savant 帮助了我,他建议在 app_controller 中使用 beforeRender(){}

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

    CakeError 是错误的 catchAll :D

    【讨论】:

    • 此方法在 CakePHP 2.x 中不再有效。而且我现在不知道该怎么做...大声笑
    • 我没有在 Cake 2.2.1 中确认。我在 beforeRender 中调试 $this->layout,得到了预期的“public_layout”,但它仍然呈现在 default.ctp 中。 DEBUG 设置为 0。
    【解决方案2】:

    在 CakePHP 2.2.2 中,我用自己的方式更改了 core.php 中的 ExceptionRenderer,如下所示:

    app/Config/core.php:

    Configure::write('Exception', array(
      'handler' => 'ErrorHandler::handleException',
      'renderer' => 'MyExceptionRenderer', // this is ExceptionRenderer by default
      '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);
      }
    
    }
    

    【讨论】:

    • 对此赞不绝口,胜过我复制每个错误视图并将布局设置为顶部的error 的旧方法。
    【解决方案3】:

    只需要在 /app/View/Errors/error400.ctp 下的 error400.ctp 文件中进行布局更改

    打开该文件并设置布局

    <?php $this->layout=''; //set your layout here ?>
    

    【讨论】:

    • +1 是一个非常简单的解决方案。工作一种享受,几乎不费吹灰之力! (CakePHP 2.4.7)
    【解决方案4】:

    最好在你的 app 文件夹中创建一个 error.php 文件

    class AppError extends ErrorHandler { 
        function error404($params) { 
                $this->controller->layout = 'error'; 
                parent::error404($params); 
        } 
    }
    

    这样您就可以避免在专家解决方案引入的每个页面呈现时进行 if 测试

    【讨论】:

      【解决方案5】:

      我对 CakePHP 2.3

      的解决方案

      更改 core.php 中的 ExceptionRenderer 以使用您自己的渲染器。

      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 
       {
          /**
           * Overrided, to always use a bare controller.
           * 
           * @param Exception $exception The exception to get a controller for.
           * @return Controller
           */
          protected function _getController($exception) {
              if (!$request = Router::getRequest(true)) {
                  $request = new CakeRequest();
              }
              $response = new CakeResponse(array('charset' => Configure::read('App.encoding')));
              $controller = new Controller($request, $response);
              $controller->viewPath = 'Errors';
              $controller->layout = 'error';
              return $controller;
          }
       }
      

      这种方法的优点是它确保从 AppController 抛出的任何异常在呈现异常时不会导致无限循环。每次都强制对异常消息进行基本呈现。

      【讨论】:

        【解决方案6】:

        我知道的最简单的方法是在你的AppController 中创建这个函数:

        function appError($method, $messages)
        {
        }
        

        然后你可以对错误做任何你想做的事情,随意显示它,或者根本不显示它,发送电子邮件等。(我不确定这个方法是否仍然有效。)

        还有一个选项可以在您的应用根目录中创建app_error.php,其中包含class AppError extends ErrorHandler,这使您能够覆盖各种错误。但是我还没有这样做,所以我不能告诉你更多关于它的信息。

        请参阅cake/libs/error.phpcake/libs/object.php,当然还有The Book 了解更多信息。

        编辑:忘了提一下,一旦你发现错误,没有什么可以阻止你——例如——将错误存储在会话中,重定向到你的“错误处理控制器”,然后显示它在您的控制器中随心所欲。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2016-11-09
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-05-02
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多