2011-12-20 55 views
4

我遇到了一個奇怪的問題,在Cake 2中我從來沒有在1.3中出錯。在CakePHP 2.0中處理錯誤。 Escaped viewVars

當一些異常升高(即NotFoundException)蛋糕的錯誤處理開始..默認情況下,實例化CakeErrorController和做所有的東西(見source)和..逃脫viewVars。但我有一些視圖變量設置在我的AppControllerbeforeRender,我不希望它們被轉義,因爲它們包含html,它們應該在佈局中呈現。這種行爲的原因是什麼?我怎麼能告訴蛋糕不要這樣做?

謝謝。

更新:

嘛。我摸索出了一些解決方案:

我創建控制器/ AppErrorController.php

App::uses('CakeErrorController', 'Controller'); 

class AppErrorController extends CakeErrorController { 
    public function beforeRender() { 
     AppController::beforeRender(); 
    } 
} 

和lib /錯誤/ AppExceptionRenderer.php

App::uses('ExceptionRenderer', 'Error'); 

class AppExceptionRenderer extends ExceptionRenderer { 
    protected function _getController($exception) { 
     App::uses('AppErrorController', 'Controller'); 
     if (!$request = Router::getRequest(false)) { 
      $request = new CakeRequest(); 
     } 
     $response = new CakeResponse(array('charset' => Configure::read('App.encoding'))); 
     try { 
      $controller = new AppErrorController($request, $response); 
     } catch (Exception $e) { 
      $controller = new Controller($request, $response); 
      $controller->viewPath = 'Errors'; 
     } 
     return $controller; 
    } 
} 

而且在配置/ core.php I set:

Configure::write('Exception', array(
    ..., 
    'renderer' => 'AppExceptionRenderer', 
    ... 
)); 

看起來像預期的那樣工作,但是有沒有更優雅的解決方案?

謝謝。

+0

對我來說似乎很奇怪,他們寫了一個beforeRender方法來轉義viewVars,我希望有人澄清這一點。 但無論如何,你看起來很乾淨。 – luchomolina 2011-12-21 21:28:31

回答

0

這可能也是因爲CakeErrorController用於所有異常 - 所以框架可以傳遞任何錯誤消息而不必擔心HTML注入或亂碼輸出。我假設它只是可靠的輸出,因爲Cake文檔將控制器描述爲"[omitting] a few of the normal callbacks to help ensure errors always display"。這是一個精簡的精簡控制器,用於特定目的。

不幸的是,這意味着他們已經對CakeErrorController的beforeRender方法進行了硬編碼,因此無法將其關閉。我能想到的只有簡單的選項是哈克......

  1. 創建使用PHP的htmlspecialchars_decod()功能逃過文本轉換回轉義文本自定義錯誤觀點。 (如果你想徹底,你也會檢查編碼等。基本上反過來h()做你的字符串)
  2. 轉換你的消息到一個對象(因爲beforeRender不是逃避對象)。

幸運的是,在文檔中提供了一個適當的解決方法,並且您已經找到了解決方法。

感覺像只是爲了獲得一些HTML到你的視圖很多工作,因爲這樣做是很多工作。MVC應該幫助區分你的擔憂,但是你通過在控制器中而不是在View中創建HTML來改變分隔。