Я столкнулся со странной проблемой с ошибками в Cake 2, которой у меня никогда не было в 1.3.
Когда возникает какое-либо исключение (например, NotFoundException), Cake начинает обрабатывать ошибки. По умолчанию он создает экземпляр CakeErrorController и выполняет все эти действия (см. source) и.. экранирует viewVars. Но у меня есть некоторые переменные представления, установленные в beforeRender моего AppController, и я не хочу, чтобы они экранировались, потому что они содержат html и должны отображаться в расположение. В чем причина такого поведения? Как я могу сказать Торту не делать этого?
Спасибо.
Обновление:
Что ж. Я разработал некоторое решение:
Я создал Controller/AppErrorController.php:
App::uses('CakeErrorController', 'Controller');
class AppErrorController extends CakeErrorController {
public function beforeRender() {
AppController::beforeRender();
}
}
и Lib/Error/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;
}
}
И в Config/core.php я установил:
Configure::write('Exception', array(
...,
'renderer' => 'AppExceptionRenderer',
...
));
Похоже, это работает так, как ожидалось, но есть ли более элегантное решение?
Благодарю вас.