Commit 82c978f8 by Carsten Brandt

draft idea of action based responses

parent 4ef19b2e
......@@ -7,6 +7,8 @@
namespace yii\base;
use Yii;
/**
* Action is the base class for all controller action classes.
*
......@@ -40,6 +42,21 @@ class Action extends Component
*/
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.
* @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.');
}
$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;
}
}
......@@ -155,6 +155,7 @@ abstract class Application extends Module
*/
abstract public function handleRequest($request);
public abstract function createResponse();
private $_runtimePath;
......
......@@ -111,6 +111,7 @@ class Controller extends Component
$oldAction = $this->action;
$this->action = $action;
$result = null;
// TODO beforeAction may also create a response somehow.
if ($this->module->beforeAction($action)) {
if ($this->beforeAction($action)) {
$result = $action->runWithParams($params);
......
......@@ -44,6 +44,8 @@ class InlineAction extends Action
public function runWithParams($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;
}
}
......@@ -93,22 +93,18 @@ class Application extends \yii\base\Application
{
list ($route, $params) = $request->resolve();
$result = $this->runAction($route, $params);
if ($result instanceof Response) {
return $result;
} else {
$response = $this->getResponse();
$response->exitStatus = (int)$result;
return $response;
}
}
/**
* Returns the response component.
* @return Response the response component
*/
public function getResponse()
public function createResponse()
{
return $this->getComponent('response');
return new Response();
}
/**
......
......@@ -65,16 +65,8 @@ class Application extends \yii\base\Application
$params = array_splice($this->catchAll, 1);
}
try {
$result = $this->runAction($route, $params);
if ($result instanceof Response) {
return $result;
} else {
$response = $this->getResponse();
if ($result !== null) {
$response->setContent($result);
}
$response = $this->runAction($route, $params);
return $response;
}
} catch (InvalidRouteException $e) {
throw new HttpException(404, $e->getMessage(), $e->getCode(), $e);
}
......@@ -119,9 +111,9 @@ class Application extends \yii\base\Application
* Returns the response component.
* @return Response the response component
*/
public function getResponse()
public function createResponse()
{
return $this->getComponent('response');
return new Response();
}
/**
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment