Browse Source

[Routing] fixed default value for Routes as they can be anything if they don't need to be used as default values for placeholders

Fabien Potencier 14 năm trước cách đây
mục cha
commit
9e7cb0a020

+ 1 - 1
src/Symfony/Component/Routing/Generator/UrlGenerator.php

@@ -120,7 +120,7 @@ class UrlGenerator implements UrlGeneratorInterface
         $optional = true;
         $optional = true;
         foreach ($tokens as $token) {
         foreach ($tokens as $token) {
             if ('variable' === $token[0]) {
             if ('variable' === $token[0]) {
-                if (false === $optional || !array_key_exists($token[3], $defaults) || (isset($parameters[$token[3]]) && $parameters[$token[3]] != $defaults[$token[3]])) {
+                if (false === $optional || !array_key_exists($token[3], $defaults) || (isset($parameters[$token[3]]) && (string) $parameters[$token[3]] != (string) $defaults[$token[3]])) {
                     if (!$isEmpty = in_array($tparams[$token[3]], array(null, '', false), true)) {
                     if (!$isEmpty = in_array($tparams[$token[3]], array(null, '', false), true)) {
                         // check requirement
                         // check requirement
                         if ($tparams[$token[3]] && !preg_match('#^'.$token[2].'$#', $tparams[$token[3]])) {
                         if ($tparams[$token[3]] && !preg_match('#^'.$token[2].'$#', $tparams[$token[3]])) {

+ 2 - 2
src/Symfony/Component/Routing/Route.php

@@ -163,7 +163,7 @@ class Route
     {
     {
         $this->defaults = array();
         $this->defaults = array();
         foreach ($defaults as $name => $default) {
         foreach ($defaults as $name => $default) {
-            $this->defaults[(string) $name] = (string) $default;
+            $this->defaults[(string) $name] = $default;
         }
         }
 
 
         return $this;
         return $this;
@@ -205,7 +205,7 @@ class Route
      */
      */
     public function setDefault($name, $default)
     public function setDefault($name, $default)
     {
     {
-        $this->defaults[(string) $name] = (string) $default;
+        $this->defaults[(string) $name] = $default;
 
 
         return $this;
         return $this;
     }
     }

+ 3 - 0
tests/Symfony/Tests/Component/Routing/RouteTest.php

@@ -65,6 +65,9 @@ class RouteTest extends \PHPUnit_Framework_TestCase
         $route->setDefault('foo2', 'bar2');
         $route->setDefault('foo2', 'bar2');
         $this->assertEquals('bar2', $route->getDefault('foo2'), '->getDefault() return the default value');
         $this->assertEquals('bar2', $route->getDefault('foo2'), '->getDefault() return the default value');
         $this->assertNull($route->getDefault('not_defined'), '->getDefault() return null if default value is not setted');
         $this->assertNull($route->getDefault('not_defined'), '->getDefault() return null if default value is not setted');
+
+        $route->setDefault('_controller', $closure = function () { return 'Hello'; });
+        $this->assertEquals($closure, $route->getDefault('_controller'), '->setDefault() sets a default value');
     }
     }
 
 
     public function testRequirements()
     public function testRequirements()