From 7221f9c3b94a88ac7f93d0871c7ee6c00ff72ad9 Mon Sep 17 00:00:00 2001 From: mark_story Date: Sun, 22 Aug 2010 12:31:55 -0400 Subject: [PATCH] Moving response construction into Controller, this will let controller classes more easily modify the response subclass they want to use. Test case updated. --- cake/libs/controller/controller.php | 32 +++++++++++++++++-- .../cases/libs/controller/controller.test.php | 23 ++++++++----- 2 files changed, 44 insertions(+), 11 deletions(-) diff --git a/cake/libs/controller/controller.php b/cake/libs/controller/controller.php index 08596f322..8ce403361 100644 --- a/cake/libs/controller/controller.php +++ b/cake/libs/controller/controller.php @@ -118,6 +118,21 @@ class Controller extends Object { */ public $request; +/** + * An instance of a CakeResponse object that contains information about the impending response + * + * @var CakeResponse + */ + public $response; + + +/** + * The classname to use for creating the response object. + * + * @var string + */ + protected $_responseClass = 'CakeResponse'; + /** * Holds pagination defaults for controller actions. The keys that can be included * in this array are: 'conditions', 'fields', 'order', 'limit', 'page', and 'recursive', @@ -322,9 +337,8 @@ class Controller extends Object { * * @param CakeRequest $request Request object for this controller can be null for testing. * But expect that features that use the params will not work. - * @param CakeResponse $response Response object for this controller */ - public function __construct($request = null, $response = null) { + public function __construct($request = null) { if ($this->name === null) { $r = null; if (!preg_match('/(.*)Controller/i', get_class($this), $r)) { @@ -349,7 +363,7 @@ class Controller extends Object { if ($request instanceof CakeRequest) { $this->_setRequest($request); } - $this->response = $response; + $this->getResponse(); parent::__construct(); } @@ -501,6 +515,18 @@ class Controller extends Object { return true; } +/** + * Gets the response object for this controller. Will construct the response if it has not already been built. + * + * @return CakeResponse + */ + public function getResponse() { + if (empty($this->response)) { + $this->response = new $this->_responseClass(array('charset' => Configure::read('App.encoding'))); + } + return $this->response; + } + /** * Perform the startup process for this controller. * Fire the Component and Controller callbacks in the correct order. diff --git a/cake/tests/cases/libs/controller/controller.test.php b/cake/tests/cases/libs/controller/controller.test.php index 64451a536..c9c99ed3c 100644 --- a/cake/tests/cases/libs/controller/controller.test.php +++ b/cake/tests/cases/libs/controller/controller.test.php @@ -856,7 +856,8 @@ class ControllerTest extends CakeTestCase { function testFlash() { $request = new CakeRequest('controller_posts/index'); - $Controller = new Controller($request, $this->getMock('CakeResponse', array('_sendHeader'))); + $Controller = new Controller($request); + $Controller->response = $this->getMock('CakeResponse', array('_sendHeader')); $Controller->flash('this should work', '/flash'); $result = $Controller->response->body(); @@ -880,7 +881,8 @@ class ControllerTest extends CakeTestCase { $this->assertEqual($result, $expected); App::build(array('views' => array(TEST_CAKE_CORE_INCLUDE_PATH . 'tests' . DS . 'test_app' . DS . 'views'. DS))); - $Controller = new Controller(null, $this->getMock('CakeResponse', array('_sendHeader'))); + $Controller = new Controller(null); + $Controller->response = $this->getMock('CakeResponse', array('_sendHeader')); $Controller->flash('this should work', '/flash', 1, 'ajax2'); $result = $Controller->response->body(); $this->assertPattern('/Ajax!/', $result); @@ -1030,11 +1032,12 @@ class ControllerTest extends CakeTestCase { * @return void */ function testRedirectByCode($code, $msg) { - $Controller = new Controller(null, $this->getMock('CakeResponse', array('header', 'statusCode'))); - + $Controller = new Controller(null); + $Controller->response = $this->getMock('CakeResponse', array('header', 'statusCode')); $Controller->Component = new Component(); $Controller->Component->init($Controller); + $Controller->response->expects($this->once())->method('statusCode') ->with($code); $Controller->response->expects($this->once())->method('header') @@ -1051,7 +1054,8 @@ class ControllerTest extends CakeTestCase { * @return void */ function testRedirectByMessage($code, $msg) { - $Controller = new Controller(null, $this->getMock('CakeResponse', array('header', 'statusCode'))); + $Controller = new Controller(null); + $Controller->response = $this->getMock('CakeResponse', array('header', 'statusCode')); $Controller->Component = new Component(); $Controller->Component->init($Controller); @@ -1072,7 +1076,8 @@ class ControllerTest extends CakeTestCase { * @return void */ function testRedirectTriggeringComponentsReturnNull() { - $Controller = new Controller(null, $this->getMock('CakeResponse', array('header', 'statusCode'))); + $Controller = new Controller(null); + $Controller->response = $this->getMock('CakeResponse', array('header', 'statusCode')); $Controller->Component = $this->getMock('Component'); $Controller->Component->expects($this->once())->method('beforeRedirect')->will($this->returnValue(null)); @@ -1092,7 +1097,8 @@ class ControllerTest extends CakeTestCase { * @return void */ function testRedirectBeforeRedirectModifyingParams() { - $Controller = new Controller(null, $this->getMock('CakeResponse', array('header', 'statusCode'))); + $Controller = new Controller(null); + $Controller->response = $this->getMock('CakeResponse', array('header', 'statusCode')); $Controller->Component = $this->getMock('Component'); $Controller->Component->expects($this->once())->method('beforeRedirect') @@ -1414,7 +1420,8 @@ class ControllerTest extends CakeTestCase { * @return void */ function testControllerHttpCodes() { - $Controller = new Controller(null, $this->getMock('CakeResponse', array('httpCodes'))); + $Controller = new Controller(null); + $Controller->response = $this->getMock('CakeResponse', array('httpCodes')); $Controller->response->expects($this->at(0))->method('httpCodes')->with(null); $Controller->response->expects($this->at(1))->method('httpCodes')->with(100); $Controller->httpCodes();