Kaynağa Gözat

[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 yıl önce
ebeveyn
işleme
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()