Browse Source

draft idea of action based responses

tags/2.0.0-beta
Carsten Brandt 12 years ago
parent
commit
82c978f86a
  1. 21
      framework/yii/base/Action.php
  2. 1
      framework/yii/base/Application.php
  3. 1
      framework/yii/base/Controller.php
  4. 4
      framework/yii/base/InlineAction.php
  5. 8
      framework/yii/console/Application.php
  6. 14
      framework/yii/web/Application.php

21
framework/yii/base/Action.php

@ -7,6 +7,8 @@
namespace yii\base; namespace yii\base;
use Yii;
/** /**
* Action is the base class for all controller action classes. * Action is the base class for all controller action classes.
* *
@ -40,6 +42,21 @@ class Action extends Component
*/ */
public $controller; public $controller;
private $_response;
public function getResponse()
{
if ($this->_response === null) {
$this->_response = Yii::$app->createResponse();
}
return $this->_response;
}
public function setResponse($response)
{
$this->_response = $response;
}
/** /**
* Constructor. * Constructor.
* @param string $id the ID of this action * @param string $id the ID of this action
@ -75,6 +92,8 @@ class Action extends Component
throw new InvalidConfigException(get_class($this) . ' must define a "run()" method.'); throw new InvalidConfigException(get_class($this) . ' must define a "run()" method.');
} }
$args = $this->controller->bindActionParams($this, $params); $args = $this->controller->bindActionParams($this, $params);
return call_user_func_array(array($this, 'run'), $args); $response = $this->getResponse();
$response->result = call_user_func_array(array($this, 'run'), $args);
return $response;
} }
} }

1
framework/yii/base/Application.php

@ -155,6 +155,7 @@ abstract class Application extends Module
*/ */
abstract public function handleRequest($request); abstract public function handleRequest($request);
public abstract function createResponse();
private $_runtimePath; private $_runtimePath;

1
framework/yii/base/Controller.php

@ -111,6 +111,7 @@ class Controller extends Component
$oldAction = $this->action; $oldAction = $this->action;
$this->action = $action; $this->action = $action;
$result = null; $result = null;
// TODO beforeAction may also create a response somehow.
if ($this->module->beforeAction($action)) { if ($this->module->beforeAction($action)) {
if ($this->beforeAction($action)) { if ($this->beforeAction($action)) {
$result = $action->runWithParams($params); $result = $action->runWithParams($params);

4
framework/yii/base/InlineAction.php

@ -44,6 +44,8 @@ class InlineAction extends Action
public function runWithParams($params) public function runWithParams($params)
{ {
$args = $this->controller->bindActionParams($this, $params); $args = $this->controller->bindActionParams($this, $params);
return call_user_func_array(array($this->controller, $this->actionMethod), $args); $response = $this->getResponse();
$response->result = call_user_func_array(array($this->controller, $this->actionMethod), $args);
return $response;
} }
} }

8
framework/yii/console/Application.php

@ -93,22 +93,18 @@ class Application extends \yii\base\Application
{ {
list ($route, $params) = $request->resolve(); list ($route, $params) = $request->resolve();
$result = $this->runAction($route, $params); $result = $this->runAction($route, $params);
if ($result instanceof Response) {
return $result;
} else {
$response = $this->getResponse(); $response = $this->getResponse();
$response->exitStatus = (int)$result; $response->exitStatus = (int)$result;
return $response; return $response;
} }
}
/** /**
* Returns the response component. * Returns the response component.
* @return Response the response component * @return Response the response component
*/ */
public function getResponse() public function createResponse()
{ {
return $this->getComponent('response'); return new Response();
} }
/** /**

14
framework/yii/web/Application.php

@ -65,16 +65,8 @@ class Application extends \yii\base\Application
$params = array_splice($this->catchAll, 1); $params = array_splice($this->catchAll, 1);
} }
try { try {
$result = $this->runAction($route, $params); $response = $this->runAction($route, $params);
if ($result instanceof Response) {
return $result;
} else {
$response = $this->getResponse();
if ($result !== null) {
$response->setContent($result);
}
return $response; return $response;
}
} catch (InvalidRouteException $e) { } catch (InvalidRouteException $e) {
throw new HttpException(404, $e->getMessage(), $e->getCode(), $e); throw new HttpException(404, $e->getMessage(), $e->getCode(), $e);
} }
@ -119,9 +111,9 @@ class Application extends \yii\base\Application
* Returns the response component. * Returns the response component.
* @return Response the response component * @return Response the response component
*/ */
public function getResponse() public function createResponse()
{ {
return $this->getComponent('response'); return new Response();
} }
/** /**

Loading…
Cancel
Save