From a5fe4a6af2ad1899741c1e29fa701984f0a1f089 Mon Sep 17 00:00:00 2001 From: Qiang Xue Date: Wed, 20 Feb 2013 08:25:06 -0500 Subject: [PATCH] Fixed URLManager bugs. --- framework/web/UrlManager.php | 4 ++-- framework/web/UrlRule.php | 7 +++++++ tests/unit/bootstrap.php | 2 +- tests/unit/framework/web/UrlManagerTest.php | 18 +++++++++++------- 4 files changed, 21 insertions(+), 10 deletions(-) diff --git a/framework/web/UrlManager.php b/framework/web/UrlManager.php index 71caf74..1425826 100644 --- a/framework/web/UrlManager.php +++ b/framework/web/UrlManager.php @@ -156,7 +156,7 @@ class UrlManager extends Component public function createUrl($route, $params = array()) { $anchor = isset($params['#']) ? '#' . $params['#'] : ''; - unset($anchor['#']); + unset($params['#']); $route = trim($route, '/'); $baseUrl = $this->getBaseUrl(); @@ -165,7 +165,7 @@ class UrlManager extends Component /** @var $rule UrlRule */ foreach ($this->rules as $rule) { if (($url = $rule->createUrl($this, $route, $params)) !== false) { - return rtrim($baseUrl, '/') . $url . $anchor; + return rtrim($baseUrl, '/') . '/' . $url . $anchor; } } diff --git a/framework/web/UrlRule.php b/framework/web/UrlRule.php index 97214c9..081a0ee 100644 --- a/framework/web/UrlRule.php +++ b/framework/web/UrlRule.php @@ -10,6 +10,7 @@ namespace yii\web; use yii\base\Object; +use yii\base\InvalidConfigException; /** * UrlRule represents a rule used for parsing and generating URLs. @@ -86,6 +87,12 @@ class UrlRule extends Object */ public function init() { + if ($this->pattern === null) { + throw new InvalidConfigException('UrlRule::pattern must be set.'); + } + if ($this->route === null) { + throw new InvalidConfigException('UrlRule::route must be set.'); + } if ($this->verb !== null) { if (is_array($this->verb)) { foreach ($this->verb as $i => $verb) { diff --git a/tests/unit/bootstrap.php b/tests/unit/bootstrap.php index f60eee0..4a388c6 100644 --- a/tests/unit/bootstrap.php +++ b/tests/unit/bootstrap.php @@ -9,4 +9,4 @@ require_once(__DIR__ . '/../../framework/yii.php'); Yii::setAlias('@yiiunit', __DIR__); -require_once(__DIR__ . '/TestCase.php'); \ No newline at end of file +require_once(__DIR__ . '/TestCase.php'); diff --git a/tests/unit/framework/web/UrlManagerTest.php b/tests/unit/framework/web/UrlManagerTest.php index afa8865..f1671f7 100644 --- a/tests/unit/framework/web/UrlManagerTest.php +++ b/tests/unit/framework/web/UrlManagerTest.php @@ -1,12 +1,14 @@ '/', @@ -14,14 +16,14 @@ class UrlManagerTest extends \yiiunit\TestCase $url = $manager->createUrl('post/view'); $this->assertEquals('/?r=post/view', $url); $url = $manager->createUrl('post/view', array('id' => 1, 'title' => 'sample post')); - $this->assertEquals('/?r=post/view&id=1&title=sample%20post', $url); + $this->assertEquals('/?r=post/view&id=1&title=sample+post', $url); // default setting with '/test/' as base url $manager = new UrlManager(array( 'baseUrl' => '/test/', )); $url = $manager->createUrl('post/view', array('id' => 1, 'title' => 'sample post')); - $this->assertEquals('/test/?r=post/view&id=1&title=sample%20post', $url); + $this->assertEquals('/test/?r=post/view&id=1&title=sample+post', $url); // pretty URL without rules $manager = new UrlManager(array( @@ -29,19 +31,19 @@ class UrlManagerTest extends \yiiunit\TestCase 'baseUrl' => '/', )); $url = $manager->createUrl('post/view', array('id' => 1, 'title' => 'sample post')); - $this->assertEquals('/post/view?r=post/view&id=1&title=sample%20post', $url); + $this->assertEquals('/post/view?id=1&title=sample+post', $url); $manager = new UrlManager(array( 'enablePrettyUrl' => true, 'baseUrl' => '/test/', )); $url = $manager->createUrl('post/view', array('id' => 1, 'title' => 'sample post')); - $this->assertEquals('/test/post/view?r=post/view&id=1&title=sample%20post', $url); + $this->assertEquals('/test/post/view?id=1&title=sample+post', $url); $manager = new UrlManager(array( 'enablePrettyUrl' => true, 'baseUrl' => '/test/index.php', )); $url = $manager->createUrl('post/view', array('id' => 1, 'title' => 'sample post')); - $this->assertEquals('/test/index.php/post/view?r=post/view&id=1&title=sample%20post', $url); + $this->assertEquals('/test/index.php/post/view?id=1&title=sample+post', $url); // todo: test showScriptName @@ -51,12 +53,13 @@ class UrlManagerTest extends \yiiunit\TestCase 'rules' => array( array( 'pattern' => 'post//', + 'route' => 'post/view', ), ), 'baseUrl' => '/', )); $url = $manager->createUrl('post/view', array('id' => 1, 'title' => 'sample post')); - $this->assertEquals('/post/view/1/sample%20test', $url); + $this->assertEquals('/post/1/sample+post', $url); $url = $manager->createUrl('post/index', array('page' => 1)); $this->assertEquals('/post/index?page=1', $url); @@ -66,13 +69,14 @@ class UrlManagerTest extends \yiiunit\TestCase 'rules' => array( array( 'pattern' => 'post/<id>/<title>', + 'route' => 'post/view', ), ), 'baseUrl' => '/', 'suffix' => '.html', )); $url = $manager->createUrl('post/view', array('id' => 1, 'title' => 'sample post')); - $this->assertEquals('/post/view/1/sample%20test.html', $url); + $this->assertEquals('/post/1/sample+post.html', $url); $url = $manager->createUrl('post/index', array('page' => 1)); $this->assertEquals('/post/index.html?page=1', $url); }