diff --git a/framework/web/Request.php b/framework/web/Request.php index 8337382..29b4970 100644 --- a/framework/web/Request.php +++ b/framework/web/Request.php @@ -409,6 +409,11 @@ class Request extends \yii\base\Request return $this->_pathInfo; } + public function setPathInfo($value) + { + $this->_pathInfo = trim($value, '/'); + } + /** * Resolves the path info part of the currently requested URL. * A path info refers to the part that is after the entry script and before the question mark (query string). diff --git a/framework/web/UrlManager.php b/framework/web/UrlManager.php index 1425826..bf52f82 100644 --- a/framework/web/UrlManager.php +++ b/framework/web/UrlManager.php @@ -10,7 +10,7 @@ namespace yii\web; use Yii; -use \yii\base\Component; +use yii\base\Component; /** * UrlManager handles HTTP request parsing and creation of URLs based on a set of rules. @@ -141,8 +141,11 @@ class UrlManager extends Component return array($pathInfo, array()); } else { - $route = (string)$request->getParam($this->routeVar); - return array($route, array()); + $route = $request->getParam($this->routeVar); + if (is_array($route)) { + $route = ''; + } + return array((string)$route, array()); } } @@ -230,9 +233,7 @@ class UrlManager extends Component public function getHostInfo() { if ($this->_hostInfo === null) { - /** @var $request \yii\web\Request */ - $request = Yii::$app->getRequest(); - $this->_hostInfo = $request->getHostInfo(); + $this->_hostInfo = Yii::$app->getRequest()->getHostInfo(); } return $this->_hostInfo; } diff --git a/tests/unit/framework/web/UrlManagerTest.php b/tests/unit/framework/web/UrlManagerTest.php index f1671f7..fcdcf7d 100644 --- a/tests/unit/framework/web/UrlManagerTest.php +++ b/tests/unit/framework/web/UrlManagerTest.php @@ -1,14 +1,13 @@ '/', @@ -50,6 +49,7 @@ class UrlManagerTest extends \yiiunit\TestCase // pretty URL with rules $manager = new UrlManager(array( 'enablePrettyUrl' => true, + 'cacheID' => false, 'rules' => array( array( 'pattern' => 'post//', @@ -66,6 +66,7 @@ class UrlManagerTest extends \yiiunit\TestCase // pretty URL with rules and suffix $manager = new UrlManager(array( 'enablePrettyUrl' => true, + 'cacheID' => false, 'rules' => array( array( 'pattern' => 'post/<id>/<title>', @@ -83,11 +84,118 @@ class UrlManagerTest extends \yiiunit\TestCase public function testCreateAbsoluteUrl() { - + $manager = new UrlManager(array( + 'baseUrl' => '/', + 'hostInfo' => 'http://www.example.com', + )); + $url = $manager->createAbsoluteUrl('post/view', array('id' => 1, 'title' => 'sample post')); + $this->assertEquals('http://www.example.com/?r=post/view&id=1&title=sample+post', $url); } public function testParseRequest() { + $manager = new UrlManager; + $request = new Request; + + // default setting without 'r' param + unset($_GET['r']); + $result = $manager->parseRequest($request); + $this->assertEquals(array('', array()), $result); + + // default setting with 'r' param + $_GET['r'] = 'site/index'; + $result = $manager->parseRequest($request); + $this->assertEquals(array('site/index', array()), $result); + + // default setting with 'r' param as an array + $_GET['r'] = array('site/index'); + $result = $manager->parseRequest($request); + $this->assertEquals(array('', array()), $result); + + // pretty URL without rules + $manager = new UrlManager(array( + 'enablePrettyUrl' => true, + )); + // empty pathinfo + $request->pathInfo = ''; + $result = $manager->parseRequest($request); + $this->assertEquals(array('', array()), $result); + // normal pathinfo + $request->pathInfo = 'site/index'; + $result = $manager->parseRequest($request); + $this->assertEquals(array('site/index', array()), $result); + // pathinfo with module + $request->pathInfo = 'module/site/index'; + $result = $manager->parseRequest($request); + $this->assertEquals(array('module/site/index', array()), $result); + // pathinfo with trailing slashes + $request->pathInfo = 'module/site/index/'; + $result = $manager->parseRequest($request); + $this->assertEquals(array('module/site/index', array()), $result); + // pretty URL rules + $manager = new UrlManager(array( + 'enablePrettyUrl' => true, + 'cacheID' => false, + 'rules' => array( + array( + 'pattern' => 'post/<id>/<title>', + 'route' => 'post/view', + ), + ), + )); + // matching pathinfo + $request->pathInfo = 'post/123/this+is+sample'; + $result = $manager->parseRequest($request); + $this->assertEquals(array('post/view', array('id' => '123', 'title' => 'this+is+sample')), $result); + // matching pathinfo with trailing slashes + $request->pathInfo = 'post/123/this+is+sample/'; + $result = $manager->parseRequest($request); + $this->assertEquals(array('post/view', array('id' => '123', 'title' => 'this+is+sample')), $result); + // empty pathinfo + $request->pathInfo = ''; + $result = $manager->parseRequest($request); + $this->assertEquals(array('', array()), $result); + // normal pathinfo + $request->pathInfo = 'site/index'; + $result = $manager->parseRequest($request); + $this->assertEquals(array('site/index', array()), $result); + // pathinfo with module + $request->pathInfo = 'module/site/index'; + $result = $manager->parseRequest($request); + $this->assertEquals(array('module/site/index', array()), $result); + + // pretty URL rules + $manager = new UrlManager(array( + 'enablePrettyUrl' => true, + 'suffix' => '.html', + 'cacheID' => false, + 'rules' => array( + array( + 'pattern' => 'post/<id>/<title>', + 'route' => 'post/view', + ), + ), + )); + // matching pathinfo + $request->pathInfo = 'post/123/this+is+sample.html'; + $result = $manager->parseRequest($request); + $this->assertEquals(array('post/view', array('id' => '123', 'title' => 'this+is+sample')), $result); + // matching pathinfo without suffix + $request->pathInfo = 'post/123/this+is+sample'; + $result = $manager->parseRequest($request); + $this->assertFalse($result); + // empty pathinfo + $request->pathInfo = ''; + $result = $manager->parseRequest($request); + $this->assertEquals(array('', array()), $result); + // normal pathinfo + $request->pathInfo = 'site/index.html'; + $result = $manager->parseRequest($request); + $this->assertEquals(array('site/index', array()), $result); + // pathinfo without suffix + $request->pathInfo = 'site/index'; + $result = $manager->parseRequest($request); + $this->assertFalse($result); } }