mirror of
https://github.com/yiisoft/yii2.git
synced 2025-08-26 14:26:54 +08:00
draft idea of action based responses
This commit is contained in:
@ -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();
|
||||
}
|
||||
|
||||
/**
|
||||
|
Reference in New Issue
Block a user