Commit a5fe4a6a by Qiang Xue

Fixed URLManager bugs.

parent 448fa79b
...@@ -156,7 +156,7 @@ class UrlManager extends Component ...@@ -156,7 +156,7 @@ class UrlManager extends Component
public function createUrl($route, $params = array()) public function createUrl($route, $params = array())
{ {
$anchor = isset($params['#']) ? '#' . $params['#'] : ''; $anchor = isset($params['#']) ? '#' . $params['#'] : '';
unset($anchor['#']); unset($params['#']);
$route = trim($route, '/'); $route = trim($route, '/');
$baseUrl = $this->getBaseUrl(); $baseUrl = $this->getBaseUrl();
...@@ -165,7 +165,7 @@ class UrlManager extends Component ...@@ -165,7 +165,7 @@ class UrlManager extends Component
/** @var $rule UrlRule */ /** @var $rule UrlRule */
foreach ($this->rules as $rule) { foreach ($this->rules as $rule) {
if (($url = $rule->createUrl($this, $route, $params)) !== false) { if (($url = $rule->createUrl($this, $route, $params)) !== false) {
return rtrim($baseUrl, '/') . $url . $anchor; return rtrim($baseUrl, '/') . '/' . $url . $anchor;
} }
} }
......
...@@ -10,6 +10,7 @@ ...@@ -10,6 +10,7 @@
namespace yii\web; namespace yii\web;
use yii\base\Object; use yii\base\Object;
use yii\base\InvalidConfigException;
/** /**
* UrlRule represents a rule used for parsing and generating URLs. * UrlRule represents a rule used for parsing and generating URLs.
...@@ -86,6 +87,12 @@ class UrlRule extends Object ...@@ -86,6 +87,12 @@ class UrlRule extends Object
*/ */
public function init() 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 ($this->verb !== null) {
if (is_array($this->verb)) { if (is_array($this->verb)) {
foreach ($this->verb as $i => $verb) { foreach ($this->verb as $i => $verb) {
......
...@@ -9,4 +9,4 @@ require_once(__DIR__ . '/../../framework/yii.php'); ...@@ -9,4 +9,4 @@ require_once(__DIR__ . '/../../framework/yii.php');
Yii::setAlias('@yiiunit', __DIR__); Yii::setAlias('@yiiunit', __DIR__);
require_once(__DIR__ . '/TestCase.php'); require_once(__DIR__ . '/TestCase.php');
\ No newline at end of file
<?php <?php
namespace yiiunit\framework\web; namespace yiiunit\framework\web;
use yii\web\Application;
use yii\web\UrlManager; use yii\web\UrlManager;
class UrlManagerTest extends \yiiunit\TestCase class UrlManagerTest extends \yiiunit\TestCase
{ {
public function testCreateUrl() public function testCreateUrl()
{ {
new Application('test', __DIR__ . '/../..');
// default setting with '/' as base url // default setting with '/' as base url
$manager = new UrlManager(array( $manager = new UrlManager(array(
'baseUrl' => '/', 'baseUrl' => '/',
...@@ -14,14 +16,14 @@ class UrlManagerTest extends \yiiunit\TestCase ...@@ -14,14 +16,14 @@ class UrlManagerTest extends \yiiunit\TestCase
$url = $manager->createUrl('post/view'); $url = $manager->createUrl('post/view');
$this->assertEquals('/?r=post/view', $url); $this->assertEquals('/?r=post/view', $url);
$url = $manager->createUrl('post/view', array('id' => 1, 'title' => 'sample post')); $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 // default setting with '/test/' as base url
$manager = new UrlManager(array( $manager = new UrlManager(array(
'baseUrl' => '/test/', 'baseUrl' => '/test/',
)); ));
$url = $manager->createUrl('post/view', array('id' => 1, 'title' => 'sample post')); $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 // pretty URL without rules
$manager = new UrlManager(array( $manager = new UrlManager(array(
...@@ -29,19 +31,19 @@ class UrlManagerTest extends \yiiunit\TestCase ...@@ -29,19 +31,19 @@ class UrlManagerTest extends \yiiunit\TestCase
'baseUrl' => '/', 'baseUrl' => '/',
)); ));
$url = $manager->createUrl('post/view', array('id' => 1, 'title' => 'sample post')); $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( $manager = new UrlManager(array(
'enablePrettyUrl' => true, 'enablePrettyUrl' => true,
'baseUrl' => '/test/', 'baseUrl' => '/test/',
)); ));
$url = $manager->createUrl('post/view', array('id' => 1, 'title' => 'sample post')); $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( $manager = new UrlManager(array(
'enablePrettyUrl' => true, 'enablePrettyUrl' => true,
'baseUrl' => '/test/index.php', 'baseUrl' => '/test/index.php',
)); ));
$url = $manager->createUrl('post/view', array('id' => 1, 'title' => 'sample post')); $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 // todo: test showScriptName
...@@ -51,12 +53,13 @@ class UrlManagerTest extends \yiiunit\TestCase ...@@ -51,12 +53,13 @@ class UrlManagerTest extends \yiiunit\TestCase
'rules' => array( 'rules' => array(
array( array(
'pattern' => 'post/<id>/<title>', 'pattern' => 'post/<id>/<title>',
'route' => 'post/view',
), ),
), ),
'baseUrl' => '/', 'baseUrl' => '/',
)); ));
$url = $manager->createUrl('post/view', array('id' => 1, 'title' => 'sample post')); $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)); $url = $manager->createUrl('post/index', array('page' => 1));
$this->assertEquals('/post/index?page=1', $url); $this->assertEquals('/post/index?page=1', $url);
...@@ -66,13 +69,14 @@ class UrlManagerTest extends \yiiunit\TestCase ...@@ -66,13 +69,14 @@ class UrlManagerTest extends \yiiunit\TestCase
'rules' => array( 'rules' => array(
array( array(
'pattern' => 'post/<id>/<title>', 'pattern' => 'post/<id>/<title>',
'route' => 'post/view',
), ),
), ),
'baseUrl' => '/', 'baseUrl' => '/',
'suffix' => '.html', 'suffix' => '.html',
)); ));
$url = $manager->createUrl('post/view', array('id' => 1, 'title' => 'sample post')); $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)); $url = $manager->createUrl('post/index', array('page' => 1));
$this->assertEquals('/post/index.html?page=1', $url); $this->assertEquals('/post/index.html?page=1', $url);
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment