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;
         foreach ($tokens as $token) {
             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)) {
                         // check requirement
                         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();
         foreach ($defaults as $name => $default) {
-            $this->defaults[(string) $name] = (string) $default;
+            $this->defaults[(string) $name] = $default;
         }
 
         return $this;
@@ -205,7 +205,7 @@ class Route
      */
     public function setDefault($name, $default)
     {
-        $this->defaults[(string) $name] = (string) $default;
+        $this->defaults[(string) $name] = $default;
 
         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');
         $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');
+
+        $route->setDefault('_controller', $closure = function () { return 'Hello'; });
+        $this->assertEquals($closure, $route->getDefault('_controller'), '->setDefault() sets a default value');
     }
 
     public function testRequirements()