Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
Browse files

Helpers in custom CakeErrorController are lost

Since many exceptions do not have its own 'template' file, customized
APP/Controller/CakeErrorController with its own list of helpers could be
ignored.

This happens becase ExceptionRenderer is forced to to use _outputMessageSafe
when a template is missing.  This causes Controller::$helpers to be reset with
default values.
  • Loading branch information...
commit 07d9a75fcb45f59bf0892a95796dcd9db1af8982 1 parent 483d712
@rchavik rchavik authored
View
6 lib/Cake/Error/ExceptionRenderer.php
@@ -263,6 +263,12 @@ protected function _outputMessage($template) {
$this->controller->render($template);
$this->controller->afterFilter();
$this->controller->response->send();
+ } catch (MissingViewException $e) {
+ try {
+ $this->_outputMessage('error500');
+ } catch (Exception $e) {
+ $this->_outputMessageSafe('error500');
+ }
} catch (Exception $e) {
$this->_outputMessageSafe('error500');
}
View
43 lib/Cake/Test/Case/Error/ExceptionRendererTest.php
@@ -278,6 +278,49 @@ public function testErrorMethodCoercion() {
}
/**
+ * test that helpers in custom CakeErrorController are not lost
+ */
+ public function testCakeErrorHelpersNotLost() {
+ $testApp = CAKE . 'Test' . DS . 'test_app' . DS;
+ App::build(array(
+ 'Controller' => array(
+ $testApp . 'Controller' . DS
+ ),
+ 'View/Helper' => array(
+ $testApp . 'View' . DS . 'Helper' . DS
+ ),
+ 'View/Layouts' => array(
+ $testApp . 'View' . DS . 'Layouts' . DS
+ ),
+ 'Error' => array(
+ $testApp . 'Error' . DS
+ ),
+ ), App::RESET);
+ Configure::write('Error', array(
+ 'handler' => 'TestAppsErrorHandler::handleError',
+ 'level' => E_ALL & ~E_DEPRECATED,
+ 'trace' => true
+ ));
+
+ Configure::write('Exception', array(
+ 'handler' => 'TestAppsErrorHandler::handleException',
+ 'renderer' => 'TestAppsExceptionRenderer',
+ 'log' => true
+ ));
+
+ App::uses('TestAppsErrorController', 'Controller');
+ App::uses('TestAppsExceptionRenderer', 'Error');
+
+ $exception = new SocketException('socket exception');
+ $renderer = new TestAppsExceptionRenderer($exception);
+
+ ob_start();
+ $renderer->render();
+ $result = ob_get_clean();
+ $this->assertContains('<b>peeled</b>', $result);
+ }
+
+/**
* test that unknown exception types with valid status codes are treated correctly.
*
* @return void
View
14 lib/Cake/Test/test_app/Controller/TestAppsErrorController.php
@@ -0,0 +1,14 @@
+<?php
+
+App::uses('CakeErrorController', 'Controller');
+
+class TestAppsErrorController extends CakeErrorController {
+
+ public $helpers = array(
+ 'Html',
+ 'Session',
+ 'Form',
+ 'Banana',
+ );
+
+}
View
21 lib/Cake/Test/test_app/Error/TestAppsExceptionRenderer.php
@@ -0,0 +1,21 @@
+<?php
+
+class TestAppsExceptionRenderer extends ExceptionRenderer {
+
+ protected function _getController($exception) {
+ App::uses('TestAppsErrorController', 'Controller');
+ if (!$request = Router::getRequest(true)) {
+ $request = new CakeRequest();
+ }
+ $response = new CakeResponse(array('charset' => Configure::read('App.encoding')));
+ try {
+ $controller = new TestAppsErrorController($request, $response);
+ $controller->layout = 'banana';
+ } catch (Exception $e) {
+ $controller = new Controller($request, $response);
+ $controller->viewPath = 'Errors';
+ }
+ return $controller;
+ }
+
+}
View
5 lib/Cake/Test/test_app/View/Helper/BananaHelper.php
@@ -19,4 +19,9 @@
App::uses('Helper', 'View');
class BananaHelper extends Helper {
+
+ public function peel() {
+ return '<b>peeled</b>';
+ }
+
}
View
5 lib/Cake/Test/test_app/View/Layouts/banana.ctp
@@ -0,0 +1,5 @@
+<body>
+<?php
+ echo $this->Banana->peel();
+?>
+</body>
Please sign in to comment.
Something went wrong with that request. Please try again.