diff --git a/apps/advanced/backend/controllers/SiteController.php b/apps/advanced/backend/controllers/SiteController.php index 7f6eb58..851fcec 100644 --- a/apps/advanced/backend/controllers/SiteController.php +++ b/apps/advanced/backend/controllers/SiteController.php @@ -17,7 +17,7 @@ class SiteController extends Controller { $model = new LoginForm(); if ($this->populate($_POST, $model) && $model->login()) { - return $this->response->redirect(array('site/index')); + return Yii::$app->response->redirect(array('site/index')); } else { return $this->render('login', array( 'model' => $model, @@ -28,6 +28,6 @@ class SiteController extends Controller public function actionLogout() { Yii::$app->user->logout(); - return $this->response->redirect(array('site/index')); + return Yii::$app->response->redirect(array('site/index')); } } diff --git a/apps/advanced/frontend/controllers/SiteController.php b/apps/advanced/frontend/controllers/SiteController.php index 7405ba1..b0f8ec2 100644 --- a/apps/advanced/frontend/controllers/SiteController.php +++ b/apps/advanced/frontend/controllers/SiteController.php @@ -27,7 +27,7 @@ class SiteController extends Controller { $model = new LoginForm(); if ($this->populate($_POST, $model) && $model->login()) { - return $this->response->redirect(array('site/index')); + return Yii::$app->response->redirect(array('site/index')); } else { return $this->render('login', array( 'model' => $model, @@ -38,7 +38,7 @@ class SiteController extends Controller public function actionLogout() { Yii::$app->user->logout(); - return $this->response->redirect(array('site/index')); + return Yii::$app->response->redirect(array('site/index')); } public function actionContact() @@ -46,7 +46,7 @@ class SiteController extends Controller $model = new ContactForm; if ($this->populate($_POST, $model) && $model->contact(Yii::$app->params['adminEmail'])) { Yii::$app->session->setFlash('contactFormSubmitted'); - return $this->response->refresh(); + return Yii::$app->response->refresh(); } else { return $this->render('contact', array( 'model' => $model, diff --git a/apps/basic/controllers/SiteController.php b/apps/basic/controllers/SiteController.php index 670e05e..d79b728 100644 --- a/apps/basic/controllers/SiteController.php +++ b/apps/basic/controllers/SiteController.php @@ -27,7 +27,7 @@ class SiteController extends Controller { $model = new LoginForm(); if ($this->populate($_POST, $model) && $model->login()) { - return $this->response->redirect(array('site/index')); + return Yii::$app->response->redirect(array('site/index')); } else { return $this->render('login', array( 'model' => $model, @@ -38,7 +38,7 @@ class SiteController extends Controller public function actionLogout() { Yii::$app->user->logout(); - return $this->response->redirect(array('site/index')); + return Yii::$app->response->redirect(array('site/index')); } public function actionContact() @@ -46,7 +46,7 @@ class SiteController extends Controller $model = new ContactForm; if ($this->populate($_POST, $model) && $model->contact(Yii::$app->params['adminEmail'])) { Yii::$app->session->setFlash('contactFormSubmitted'); - return $this->response->refresh(); + return Yii::$app->response->refresh(); } else { return $this->render('contact', array( 'model' => $model, diff --git a/framework/yii/base/Action.php b/framework/yii/base/Action.php index 574fd4c..8778cab 100644 --- a/framework/yii/base/Action.php +++ b/framework/yii/base/Action.php @@ -7,8 +7,6 @@ namespace yii\base; -use Yii; - /** * Action is the base class for all controller action classes. * @@ -41,31 +39,6 @@ class Action extends Component * @var Controller the controller that owns this action */ public $controller; - /** - * @var Response - */ - private $_response; - - - /** - * @return Response|\yii\console\Response|\yii\web\Response - */ - public function getResponse() - { - if ($this->_response === null) { - // TODO use applications response factory here - //$this->_response = new Response(); - } - return $this->_response; - } - - /** - * @param Response $response - */ - public function setResponse($response) - { - $this->_response = $response; - } /** * Constructor. diff --git a/framework/yii/base/Application.php b/framework/yii/base/Application.php index 5b805ad..9eeb53b 100644 --- a/framework/yii/base/Application.php +++ b/framework/yii/base/Application.php @@ -155,6 +155,7 @@ abstract class Application extends Module */ abstract public function handleRequest($request); + private $_runtimePath; /** diff --git a/framework/yii/base/Controller.php b/framework/yii/base/Controller.php index c313959..b6275a8 100644 --- a/framework/yii/base/Controller.php +++ b/framework/yii/base/Controller.php @@ -15,7 +15,7 @@ use Yii; * @author Qiang Xue * @since 2.0 */ -abstract class Controller extends Component +class Controller extends Component { /** * @event ActionEvent an event raised right before executing a controller action. @@ -110,39 +110,22 @@ abstract class Controller extends Component if ($action !== null) { $oldAction = $this->action; $this->action = $action; + $result = null; if ($this->module->beforeAction($action)) { if ($this->beforeAction($action)) { $result = $action->runWithParams($params); - if ($result !== null) { - $this->handleActionResult($result, $action); - } $this->afterAction($action); } $this->module->afterAction($action); } $this->action = $oldAction; - return $action->getResponse(); + return $result; } else { throw new InvalidRouteException('Unable to resolve the request: ' . $this->getUniqueId() . '/' . $id); } } /** - * Handles the return value of an action - * @param mixed $result - * @param Action $action - */ - protected abstract function handleActionResult(&$result, $action); - - /** - * @return Response the response object of the current action. null if no action is running - */ - public function getResponse() - { - return $this->action !== null ? $this->action->getResponse() : null; - } - - /** * Runs a request specified in terms of a route. * The route can be either an ID of an action within this controller or a complete route consisting * of module IDs, controller ID and action ID. If the route starts with a slash '/', the parsing of diff --git a/framework/yii/base/ErrorHandler.php b/framework/yii/base/ErrorHandler.php index dc1e00b..338a392 100644 --- a/framework/yii/base/ErrorHandler.php +++ b/framework/yii/base/ErrorHandler.php @@ -9,7 +9,6 @@ namespace yii\base; use Yii; use yii\web\HttpException; -use yii\web\Response; /** * ErrorHandler handles uncaught PHP errors and exceptions. @@ -90,13 +89,8 @@ class ErrorHandler extends Component $useErrorView = !YII_DEBUG || $exception instanceof UserException; - if (Yii::$app->controller !== null) { - $response = Yii::$app->controller->getResponse(); - $response->getHeaders()->removeAll(); - } - if (empty($response)) { - $response = new Response(); - } + $response = Yii::$app->getResponse(); + $response->getHeaders()->removeAll(); if ($useErrorView && $this->errorAction !== null) { $result = Yii::$app->runAction($this->errorAction); diff --git a/framework/yii/base/Module.php b/framework/yii/base/Module.php index fbe6064..6603b28 100644 --- a/framework/yii/base/Module.php +++ b/framework/yii/base/Module.php @@ -571,7 +571,7 @@ abstract class Module extends Component * If the route is empty, the method will use [[defaultRoute]]. * @param string $route the route that specifies the action. * @param array $params the parameters to be passed to the action - * @return Response the resulting response of the action. + * @return mixed the result of the action. * @throws InvalidRouteException if the requested route cannot be resolved into an action successfully */ public function runAction($route, $params = array()) @@ -582,9 +582,9 @@ abstract class Module extends Component list($controller, $actionID) = $parts; $oldController = Yii::$app->controller; Yii::$app->controller = $controller; - $response = $controller->runAction($actionID, $params); + $result = $controller->runAction($actionID, $params); Yii::$app->controller = $oldController; - return $response; + return $result; } else { throw new InvalidRouteException('Unable to resolve the request "' . trim($this->getUniqueId() . '/' . $route, '/') . '".'); } diff --git a/framework/yii/console/Application.php b/framework/yii/console/Application.php index 1a58ed6..c5e22ab 100644 --- a/framework/yii/console/Application.php +++ b/framework/yii/console/Application.php @@ -88,13 +88,43 @@ class Application extends \yii\base\Application * Handles the specified request. * @param Request $request the request to be handled * @return Response the resulting response - * @throws Exception if the route is invalid */ public function handleRequest($request) { 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() + { + return $this->getComponent('response'); + } + + /** + * Runs a controller action specified by a route. + * This method parses the specified route and creates the corresponding child module(s), controller and action + * instances. It then calls [[Controller::runAction()]] to run the action with the given parameters. + * If the route is empty, the method will use [[defaultRoute]]. + * @param string $route the route that specifies the action. + * @param array $params the parameters to be passed to the action + * @return integer the status code returned by the action execution. 0 means normal, and other values mean abnormal. + * @throws Exception if the route is invalid + */ + public function runAction($route, $params = array()) + { try { - return $this->runAction($route, $params); + return parent::runAction($route, $params); } catch (InvalidRouteException $e) { throw new Exception(\Yii::t('yii', 'Unknown command "{command}".', array('{command}' => $route)), 0, $e); } @@ -126,6 +156,9 @@ class Application extends \yii\base\Application 'request' => array( 'class' => 'yii\console\Request', ), + 'response' => array( + 'class' => 'yii\console\Response', + ), )); } } diff --git a/framework/yii/console/Controller.php b/framework/yii/console/Controller.php index 01a70ff..e4d4211 100644 --- a/framework/yii/console/Controller.php +++ b/framework/yii/console/Controller.php @@ -135,16 +135,6 @@ class Controller extends \yii\base\Controller } /** - * Handles the return value of an action - * @param mixed $result - * @param Action $action - */ - protected function handleActionResult(&$result, $action) - { - $action->getResponse()->exitStatus = (int)$result; - } - - /** * Formats a string with ANSI codes * * You may pass additional parameters using the constants defined in [[yii\helpers\base\Console]]. diff --git a/framework/yii/web/Application.php b/framework/yii/web/Application.php index 4babc22..6536db7 100644 --- a/framework/yii/web/Application.php +++ b/framework/yii/web/Application.php @@ -65,7 +65,16 @@ class Application extends \yii\base\Application $params = array_splice($this->catchAll, 1); } try { - return $this->runAction($route, $params); + $result = $this->runAction($route, $params); + if ($result instanceof Response) { + return $result; + } else { + $response = $this->getResponse(); + if ($result !== null) { + $response->setContent($result); + } + return $response; + } } catch (InvalidRouteException $e) { throw new HttpException(404, $e->getMessage(), $e->getCode(), $e); } @@ -107,6 +116,15 @@ class Application extends \yii\base\Application } /** + * Returns the response component. + * @return Response the response component + */ + public function getResponse() + { + return $this->getComponent('response'); + } + + /** * Returns the session component. * @return Session the session component */ @@ -144,6 +162,9 @@ class Application extends \yii\base\Application 'request' => array( 'class' => 'yii\web\Request', ), + 'response' => array( + 'class' => 'yii\web\Response', + ), 'session' => array( 'class' => 'yii\web\Session', ), diff --git a/framework/yii/web/CaptchaAction.php b/framework/yii/web/CaptchaAction.php index 47eded8..1e22627 100644 --- a/framework/yii/web/CaptchaAction.php +++ b/framework/yii/web/CaptchaAction.php @@ -325,7 +325,7 @@ class CaptchaAction extends Action */ protected function setHttpHeaders() { - $this->getResponse()->getHeaders() + Yii::$app->getResponse()->getHeaders() ->set('Pragma', 'public') ->set('Expires', '0') ->set('Cache-Control', 'must-revalidate, post-check=0, pre-check=0') diff --git a/framework/yii/web/Controller.php b/framework/yii/web/Controller.php index ee25afc..6214c54 100644 --- a/framework/yii/web/Controller.php +++ b/framework/yii/web/Controller.php @@ -8,7 +8,6 @@ namespace yii\web; use Yii; -use yii\base\Action; use yii\base\InlineAction; /** @@ -63,16 +62,6 @@ class Controller extends \yii\base\Controller } /** - * Handles the return value of an action - * @param mixed $result - * @param Action $action - */ - protected function handleActionResult(&$result, $action) - { - $action->getResponse()->setContent($result); - } - - /** * Creates a URL using the given route and parameters. * * This method enhances [[UrlManager::createUrl()]] by supporting relative routes. diff --git a/framework/yii/web/HttpCache.php b/framework/yii/web/HttpCache.php index 785c7dd..cc9e6ed 100644 --- a/framework/yii/web/HttpCache.php +++ b/framework/yii/web/HttpCache.php @@ -74,8 +74,8 @@ class HttpCache extends ActionFilter $etag = $this->generateEtag($seed); } - $response = $action->getResponse(); - $this->sendCacheControlHeader($response); + $this->sendCacheControlHeader(); + $response = Yii::$app->getResponse(); if ($etag !== null) { $response->getHeaders()->set('Etag', $etag); } @@ -109,13 +109,12 @@ class HttpCache extends ActionFilter /** * Sends the cache control header to the client - * @param Response $response * @see cacheControl */ - protected function sendCacheControlHeader($response) + protected function sendCacheControlHeader() { session_cache_limiter('public'); - $headers = $response->getHeaders(); + $headers = Yii::$app->getResponse()->getHeaders(); $headers->set('Pragma'); if ($this->cacheControlHeader !== null) { $headers->set('Cache-Control', $this->cacheControlHeader); diff --git a/framework/yii/web/Request.php b/framework/yii/web/Request.php index 0af80d5..1027011 100644 --- a/framework/yii/web/Request.php +++ b/framework/yii/web/Request.php @@ -788,7 +788,7 @@ class Request extends \yii\base\Request $this->_csrfCookie = $this->getCookies()->get($this->csrfTokenName); if ($this->_csrfCookie === null) { $this->_csrfCookie = $this->createCsrfCookie(); - Yii::$app->controller->getResponse()->getCookies()->add($this->_csrfCookie); + Yii::$app->getResponse()->getCookies()->add($this->_csrfCookie); } } diff --git a/framework/yii/web/User.php b/framework/yii/web/User.php index 7091dd5..d4646a6 100644 --- a/framework/yii/web/User.php +++ b/framework/yii/web/User.php @@ -283,7 +283,8 @@ class User extends Component $this->setReturnUrl($request->getUrl()); } if ($this->loginUrl !== null) { - Yii::$app->controller->getResponse()->redirect($this->loginUrl)->send(); + $response = Yii::$app->getResponse(); + $response->redirect($this->loginUrl)->send(); exit(); } else { throw new HttpException(403, Yii::t('yii', 'Login Required')); @@ -371,7 +372,7 @@ class User extends Component $cookie = new Cookie($this->identityCookie); $cookie->value = $value; $cookie->expire = time() + (int)$data[2]; - Yii::$app->controller->getResponse()->getCookies()->add($cookie); + Yii::$app->getResponse()->getCookies()->add($cookie); } } } @@ -394,7 +395,7 @@ class User extends Component $duration, )); $cookie->expire = time() + $duration; - Yii::$app->controller->getResponse()->getCookies()->add($cookie); + Yii::$app->getResponse()->getCookies()->add($cookie); } /** @@ -428,7 +429,7 @@ class User extends Component $this->sendIdentityCookie($identity, $duration); } } elseif ($this->enableAutoLogin) { - Yii::$app->controller->getResponse()->getCookies()->remove(new Cookie($this->identityCookie)); + Yii::$app->getResponse()->getCookies()->remove(new Cookie($this->identityCookie)); } } diff --git a/framework/yii/web/VerbFilter.php b/framework/yii/web/VerbFilter.php index ffd82c2..4f45190 100644 --- a/framework/yii/web/VerbFilter.php +++ b/framework/yii/web/VerbFilter.php @@ -80,7 +80,7 @@ class VerbFilter extends Behavior if (!in_array($verb, $allowed)) { $event->isValid = false; // http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.7 - $event->action->getResponse()->getHeaders()->set('Allow', implode(', ', $allowed)); + Yii::$app->getResponse()->getHeaders()->set('Allow', implode(', ', $allowed)); throw new HttpException(405, 'Method Not Allowed. This url can only handle the following request methods: ' . implode(', ', $allowed)); } } diff --git a/tests/unit/framework/helpers/HtmlTest.php b/tests/unit/framework/helpers/HtmlTest.php index 0399a4e..018a820 100644 --- a/tests/unit/framework/helpers/HtmlTest.php +++ b/tests/unit/framework/helpers/HtmlTest.php @@ -17,6 +17,9 @@ class HtmlTest extends TestCase 'class' => 'yii\web\Request', 'url' => '/test', ), + 'response' => array( + 'class' => 'yii\web\Response', + ), ), )); }