mirror of
https://github.com/kamilwylegala/cakephp2-php8.git
synced 2024-11-15 03:18:26 +00:00
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.
This commit is contained in:
parent
483d7124dd
commit
07d9a75fcb
6 changed files with 94 additions and 0 deletions
|
@ -263,6 +263,12 @@ class ExceptionRenderer {
|
|||
$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');
|
||||
}
|
||||
|
|
|
@ -277,6 +277,49 @@ class ExceptionRendererTest extends CakeTestCase {
|
|||
$this->assertEquals($exception, $ExceptionRenderer->error);
|
||||
}
|
||||
|
||||
/**
|
||||
* 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.
|
||||
*
|
||||
|
|
|
@ -0,0 +1,14 @@
|
|||
<?php
|
||||
|
||||
App::uses('CakeErrorController', 'Controller');
|
||||
|
||||
class TestAppsErrorController extends CakeErrorController {
|
||||
|
||||
public $helpers = array(
|
||||
'Html',
|
||||
'Session',
|
||||
'Form',
|
||||
'Banana',
|
||||
);
|
||||
|
||||
}
|
21
lib/Cake/Test/test_app/Error/TestAppsExceptionRenderer.php
Normal file
21
lib/Cake/Test/test_app/Error/TestAppsExceptionRenderer.php
Normal file
|
@ -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;
|
||||
}
|
||||
|
||||
}
|
|
@ -19,4 +19,9 @@
|
|||
App::uses('Helper', 'View');
|
||||
|
||||
class BananaHelper extends Helper {
|
||||
|
||||
public function peel() {
|
||||
return '<b>peeled</b>';
|
||||
}
|
||||
|
||||
}
|
||||
|
|
5
lib/Cake/Test/test_app/View/Layouts/banana.ctp
Normal file
5
lib/Cake/Test/test_app/View/Layouts/banana.ctp
Normal file
|
@ -0,0 +1,5 @@
|
|||
<body>
|
||||
<?php
|
||||
echo $this->Banana->peel();
|
||||
?>
|
||||
</body>
|
Loading…
Reference in a new issue