diff --git a/extensions/debug/panels/DbPanel.php b/extensions/debug/panels/DbPanel.php index 271373b..9e6002c 100644 --- a/extensions/debug/panels/DbPanel.php +++ b/extensions/debug/panels/DbPanel.php @@ -53,7 +53,7 @@ class DbPanel extends Panel public function getDetail() { $searchModel = new Db(); - $dataProvider = $searchModel->search(Yii::$app->request->get(), $this->getModels()); + $dataProvider = $searchModel->search(Yii::$app->request->getQueryParams(), $this->getModels()); return Yii::$app->view->render('panels/db/detail', [ 'panel' => $this, diff --git a/extensions/debug/panels/LogPanel.php b/extensions/debug/panels/LogPanel.php index d96704e..4f583c0 100644 --- a/extensions/debug/panels/LogPanel.php +++ b/extensions/debug/panels/LogPanel.php @@ -39,7 +39,7 @@ class LogPanel extends Panel public function getDetail() { $searchModel = new Log(); - $dataProvider = $searchModel->search(Yii::$app->request->get(), $this->getModels()); + $dataProvider = $searchModel->search(Yii::$app->request->getQueryParams(), $this->getModels()); return Yii::$app->view->render('panels/log/detail', [ 'dataProvider' => $dataProvider, diff --git a/extensions/debug/panels/ProfilingPanel.php b/extensions/debug/panels/ProfilingPanel.php index 9316552..b4dc57b 100644 --- a/extensions/debug/panels/ProfilingPanel.php +++ b/extensions/debug/panels/ProfilingPanel.php @@ -42,7 +42,7 @@ class ProfilingPanel extends Panel public function getDetail() { $searchModel = new Profile(); - $dataProvider = $searchModel->search(Yii::$app->request->get(), $this->getModels()); + $dataProvider = $searchModel->search(Yii::$app->request->getQueryParams(), $this->getModels()); return Yii::$app->view->render('panels/profile/detail', [ 'panel' => $this, diff --git a/framework/CHANGELOG.md b/framework/CHANGELOG.md index 154c064..5ee87d0 100644 --- a/framework/CHANGELOG.md +++ b/framework/CHANGELOG.md @@ -96,6 +96,9 @@ Yii Framework 2 Change Log - Chg #1821: Changed default values for yii\db\Connection username and password to null (cebe) - Chg #1844: `Response::sendFile()` and other file sending methods will not send the response (qiangxue) - Chg #1852: DbConnection::tablePrefix default value now 'tbl_' (creocoder) +- Chg #2043: Renamed `yii\web\Request::acceptedLanguages` to `acceptableLanguages` (qiangxue) +- Chg #2043: Removed `yii\web\Request::getPut()`, `getDelete()`, `getPatch()` in favor of `getBodyParam()` (cebe) +- Chg #2043: Renamed `yii\web\Request::get()` to `getQueryParams()` and `getRestParams()` to `getBodyParams()` (cebe) - Chg #2057: AutoTimestamp attributes defaults changed from `create_time` and `update_time` to `created_at` and `updated_at` (creocoder) - Chg #2063: Removed `yii\web\Request::acceptTypes` and renamed `yii\web\Request::acceptedContentTypes` to `acceptableContentTypes` (qiangxue) - Chg: Renamed `yii\jui\Widget::clientEventsMap` to `clientEventMap` (qiangxue) @@ -108,7 +111,6 @@ Yii Framework 2 Change Log - Chg: Changed the directory structure according to PSR-4. You have to update your application `index.php`, `index-test.php` and `yii` files to point to the new location of `Yii.php` (qiangxue, cebe) - Chg: Advanced app template: moved database connection DSN, login and password to `-local` config not to expose it to VCS (samdark) -- Chg: Renamed `yii\web\Request::acceptedLanguages` to `acceptableLanguages` (qiangxue) - New #66: [Auth client library](https://github.com/yiisoft/yii2-authclient) OpenId, OAuth1, OAuth2 clients (klimov-paul) - New #1393: [Codeception testing framework integration](https://github.com/yiisoft/yii2-codeception) (Ragazzo) - New #1438: [MongoDB integration](https://github.com/yiisoft/yii2-mongodb) ActiveRecord and Query (klimov-paul) diff --git a/framework/data/Pagination.php b/framework/data/Pagination.php index 1c2b534..8e77c6b 100644 --- a/framework/data/Pagination.php +++ b/framework/data/Pagination.php @@ -141,7 +141,7 @@ class Pagination extends Object if ($this->_page === null || $recalculate) { if (($params = $this->params) === null) { $request = Yii::$app->getRequest(); - $params = $request instanceof Request ? $request->get() : []; + $params = $request instanceof Request ? $request->getQueryParams() : []; } if (isset($params[$this->pageVar]) && is_scalar($params[$this->pageVar])) { $this->_page = (int)$params[$this->pageVar] - 1; @@ -183,7 +183,7 @@ class Pagination extends Object { if (($params = $this->params) === null) { $request = Yii::$app->getRequest(); - $params = $request instanceof Request ? $request->get() : []; + $params = $request instanceof Request ? $request->getQueryParams() : []; } if ($page > 0 || $page >= 0 && $this->forcePageVar) { $params[$this->pageVar] = $page + 1; diff --git a/framework/data/Sort.php b/framework/data/Sort.php index ab49f49..efac90e 100644 --- a/framework/data/Sort.php +++ b/framework/data/Sort.php @@ -245,7 +245,7 @@ class Sort extends Object $this->_attributeOrders = []; if (($params = $this->params) === null) { $request = Yii::$app->getRequest(); - $params = $request instanceof Request ? $request->get() : []; + $params = $request instanceof Request ? $request->getQueryParams() : []; } if (isset($params[$this->sortVar]) && is_scalar($params[$this->sortVar])) { $attributes = explode($this->separators[0], $params[$this->sortVar]); @@ -341,7 +341,7 @@ class Sort extends Object { if (($params = $this->params) === null) { $request = Yii::$app->getRequest(); - $params = $request instanceof Request ? $request->get() : []; + $params = $request instanceof Request ? $request->getQueryParams() : []; } $params[$this->sortVar] = $this->createSortVar($attribute); $route = $this->route === null ? Yii::$app->controller->getRoute() : $this->route; diff --git a/framework/helpers/BaseHtml.php b/framework/helpers/BaseHtml.php index 0fe86af..4d28404 100644 --- a/framework/helpers/BaseHtml.php +++ b/framework/helpers/BaseHtml.php @@ -237,7 +237,7 @@ class BaseHtml if ($request instanceof Request) { if (strcasecmp($method, 'get') && strcasecmp($method, 'post')) { // simulate PUT, DELETE, etc. via POST - $hiddenInputs[] = static::hiddenInput($request->restVar, $method); + $hiddenInputs[] = static::hiddenInput($request->methodVar, $method); $method = 'post'; } if ($request->enableCsrfValidation && !strcasecmp($method, 'post')) { diff --git a/framework/web/Request.php b/framework/web/Request.php index f9563da..611e601 100644 --- a/framework/web/Request.php +++ b/framework/web/Request.php @@ -9,8 +9,6 @@ namespace yii\web; use Yii; use yii\base\InvalidConfigException; -use yii\base\InvalidParamException; -use yii\helpers\Json; use yii\helpers\Security; use yii\helpers\StringHelper; @@ -125,11 +123,11 @@ class Request extends \yii\base\Request * @var string|boolean the name of the POST parameter that is used to indicate if a request is a PUT, PATCH or DELETE * request tunneled through POST. Default to '_method'. * @see getMethod() - * @see getRestParams() + * @see getBodyParams() */ - public $restVar = '_method'; + public $methodVar = '_method'; /** - * @var array the parsers for converting the raw HTTP request body into [[restParams]]. + * @var array the parsers for converting the raw HTTP request body into [[bodyParams]]. * The array keys are the request `Content-Types`, and the array values are the * corresponding configurations for [[Yii::createObject|creating the parser objects]]. * A parser must implement the [[RequestParserInterface]]. @@ -145,7 +143,7 @@ class Request extends \yii\base\Request * To register a parser for parsing all request types you can use `'*'` as the array key. * This one will be used as a fallback in case no other types match. * - * @see getRestParams() + * @see getBodyParams() */ public $parsers = []; @@ -176,8 +174,8 @@ class Request extends \yii\base\Request */ public function getMethod() { - if (isset($_POST[$this->restVar])) { - return strtoupper($_POST[$this->restVar]); + if (isset($_POST[$this->methodVar])) { + return strtoupper($_POST[$this->methodVar]); } else { return isset($_SERVER['REQUEST_METHOD']) ? strtoupper($_SERVER['REQUEST_METHOD']) : 'GET'; } @@ -265,78 +263,112 @@ class Request extends \yii\base\Request (stripos($_SERVER['HTTP_USER_AGENT'], 'Shockwave') !== false || stripos($_SERVER['HTTP_USER_AGENT'], 'Flash') !== false); } - private $_restParams; + private $_rawBody; + + /** + * Returns the raw HTTP request body. + * @return string the request body + */ + public function getRawBody() + { + if ($this->_rawBody === null) { + $this->_rawBody = file_get_contents('php://input'); + } + return $this->_rawBody; + } + + private $_bodyParams; /** - * Returns the request parameters for the RESTful request. + * Returns the request parameters given in the request body. * * Request parameters are determined using the parsers configured in [[parsers]] property. * If no parsers are configured for the current [[contentType]] it uses the PHP function [[mb_parse_str()]] * to parse the [[rawBody|request body]]. - * @return array the RESTful request parameters + * @return array the request parameters given in the request body. * @throws \yii\base\InvalidConfigException if a registered parser does not implement the [[RequestParserInterface]]. * @see getMethod() + * @see getBodyParam() + * @see setBodyParams() */ - public function getRestParams() + public function getBodyParams() { - if ($this->_restParams === null) { + if ($this->_bodyParams === null) { $contentType = $this->getContentType(); - if (isset($_POST[$this->restVar])) { - $this->_restParams = $_POST; - unset($this->_restParams[$this->restVar]); + if (isset($_POST[$this->methodVar])) { + $this->_bodyParams = $_POST; + unset($this->_bodyParams[$this->methodVar]); } elseif (isset($this->parsers[$contentType])) { $parser = Yii::createObject($this->parsers[$contentType]); if (!($parser instanceof RequestParserInterface)) { throw new InvalidConfigException("The '$contentType' request parser is invalid. It must implement the yii\\web\\RequestParserInterface."); } - $this->_restParams = $parser->parse($this->getRawBody(), $contentType); + $this->_bodyParams = $parser->parse($this->getRawBody(), $contentType); } elseif (isset($this->parsers['*'])) { $parser = Yii::createObject($this->parsers['*']); if (!($parser instanceof RequestParserInterface)) { throw new InvalidConfigException("The fallback request parser is invalid. It must implement the yii\\web\\RequestParserInterface."); } - $this->_restParams = $parser->parse($this->getRawBody(), $contentType); + $this->_bodyParams = $parser->parse($this->getRawBody(), $contentType); } else { - $this->_restParams = []; - mb_parse_str($this->getRawBody(), $this->_restParams); + $this->_bodyParams = []; + mb_parse_str($this->getRawBody(), $this->_bodyParams); } } - return $this->_restParams; + return $this->_bodyParams; } - private $_rawBody; + /** + * Sets the request body parameters. + * @param array $values the request body parameters (name-value pairs) + * @see getBodyParam() + * @see getBodyParams() + */ + public function setBodyParams($values) + { + $this->_bodyParams = $values; + } /** - * Returns the raw HTTP request body. - * @return string the request body + * Returns the named request body parameter value. + * @param string $name the parameter name + * @param mixed $defaultValue the default parameter value if the parameter does not exist. + * @return mixed the parameter value + * @see getBodyParams() + * @see setBodyParams() */ - public function getRawBody() + public function getBodyParam($name, $defaultValue = null) { - if ($this->_rawBody === null) { - $this->_rawBody = file_get_contents('php://input'); - } - return $this->_rawBody; + $params = $this->getBodyParams(); + return isset($params[$name]) ? $params[$name] : $defaultValue; } + private $_queryParams; + /** - * Sets the RESTful parameters. - * @param array $values the RESTful parameters (name-value pairs) + * Returns the request parameters given in the [[queryString]]. + * + * This method will return the contents of `$_GET` if params where not explicitly set. + * @return array the request GET parameter values. + * @see setQueryParams() */ - public function setRestParams($values) + public function getQueryParams() { - $this->_restParams = $values; + if ($this->_queryParams === null) { + return $_GET; + } + return $this->_queryParams; } /** - * Returns the named RESTful parameter value. - * @param string $name the parameter name - * @param mixed $defaultValue the default parameter value if the parameter does not exist. - * @return mixed the parameter value + * Sets the request [[queryString]] parameters. + * @param array $values the request query parameters (name-value pairs) + * @see getQueryParam() + * @see getQueryParams() */ - public function getRestParam($name, $defaultValue = null) + public function setQueryParams($values) { - $params = $this->getRestParams(); - return isset($params[$name]) ? $params[$name] : $defaultValue; + $this->_queryParams = $values; } /** @@ -347,12 +379,10 @@ class Request extends \yii\base\Request * @return mixed the GET parameter value * @see getPost() */ - public function get($name = null, $defaultValue = null) + public function getQueryParam($name, $defaultValue = null) { - if ($name === null) { - return $_GET; - } - return isset($_GET[$name]) ? $_GET[$name] : $defaultValue; + $params = $this->getQueryParams(); + return isset($params[$name]) ? $params[$name] : $defaultValue; } /** @@ -364,7 +394,7 @@ class Request extends \yii\base\Request * @return mixed the POST parameter value * @see get() */ - public function getPost($name = null, $defaultValue = null) + public function getPostParam($name = null, $defaultValue = null) { if ($name === null) { return $_POST; @@ -372,51 +402,6 @@ class Request extends \yii\base\Request return isset($_POST[$name]) ? $_POST[$name] : $defaultValue; } - /** - * Returns the named DELETE parameter value. - * @param string $name the DELETE parameter name. If not specified, an array of DELETE parameters is returned. - * @param mixed $defaultValue the default parameter value if the DELETE parameter does not exist. - * @property array the DELETE request parameter values - * @return mixed the DELETE parameter value - */ - public function getDelete($name = null, $defaultValue = null) - { - if ($name === null) { - return $this->getRestParams(); - } - return $this->getIsDelete() ? $this->getRestParam($name, $defaultValue) : null; - } - - /** - * Returns the named PUT parameter value. - * @param string $name the PUT parameter name. If not specified, an array of PUT parameters is returned. - * @param mixed $defaultValue the default parameter value if the PUT parameter does not exist. - * @property array the PUT request parameter values - * @return mixed the PUT parameter value - */ - public function getPut($name = null, $defaultValue = null) - { - if ($name === null) { - return $this->getRestParams(); - } - return $this->getIsPut() ? $this->getRestParam($name, $defaultValue) : null; - } - - /** - * Returns the named PATCH parameter value. - * @param string $name the PATCH parameter name. If not specified, an array of PATCH parameters is returned. - * @param mixed $defaultValue the default parameter value if the PATCH parameter does not exist. - * @property array the PATCH request parameter values - * @return mixed the PATCH parameter value - */ - public function getPatch($name = null, $defaultValue = null) - { - if ($name === null) { - return $this->getRestParams(); - } - return $this->getIsPatch() ? $this->getRestParam($name, $defaultValue) : null; - } - private $_hostInfo; /** @@ -1151,24 +1136,12 @@ class Request extends \yii\base\Request public function validateCsrfToken() { $method = $this->getMethod(); - if (!$this->enableCsrfValidation || !in_array($method, ['POST', 'PUT', 'PATCH', 'DELETE'], true)) { + // only validate CSRF token on "safe" methods http://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html#sec9.1.1 + if (!$this->enableCsrfValidation || in_array($method, ['GET', 'HEAD', 'OPTIONS'], true)) { return true; } $trueToken = $this->getCookies()->getValue($this->csrfVar); - switch ($method) { - case 'PUT': - $token = $this->getPut($this->csrfVar); - break; - case 'PATCH': - $token = $this->getPatch($this->csrfVar); - break; - case 'DELETE': - $token = $this->getDelete($this->csrfVar); - break; - default: - $token = $this->getPost($this->csrfVar); - break; - } + $token = $this->getBodyParam($this->csrfVar); return $this->validateCsrfTokenInternal($token, $trueToken) || $this->validateCsrfTokenInternal($this->getCsrfTokenFromHeader(), $trueToken); } diff --git a/framework/web/UrlManager.php b/framework/web/UrlManager.php index a2044cb..b87c20d 100644 --- a/framework/web/UrlManager.php +++ b/framework/web/UrlManager.php @@ -217,7 +217,7 @@ class UrlManager extends Component return [$pathInfo, []]; } else { Yii::trace('Pretty URL not enabled. Using default URL parsing logic.', __METHOD__); - $route = $request->get($this->routeVar); + $route = $request->getQueryParam($this->routeVar, ''); if (is_array($route)) { $route = ''; }