Ver código fonte

[Routing] added requirements checking when generating a route

Fabien Potencier 15 anos atrás
pai
commit
0d05db0afc

+ 4 - 3
src/Symfony/Components/Routing/Generator/Dumper/PhpGeneratorDumper.php

@@ -59,12 +59,13 @@ class PhpGeneratorDumper extends GeneratorDumper
 
       $variables = str_replace("\n", '', var_export($compiledRoute->getVariables(), true));
       $defaults = str_replace("\n", '', var_export($route->getDefaults(), true));
+      $requirements = str_replace("\n", '', var_export($compiledRoute->getRequirements(), true));
       $tokens = str_replace("\n", '', var_export($compiledRoute->getTokens(), true));
 
       $methods[] = <<<EOF
   protected function get{$name}RouteInfo()
   {
-    return array($variables, array_merge(\$this->defaults, $defaults), $tokens);
+    return array($variables, array_merge(\$this->defaults, $defaults), $requirements, $tokens);
   }
 
 EOF
@@ -82,9 +83,9 @@ EOF
       throw new \InvalidArgumentException(sprintf('Route "%s" does not exist.', \$name));
     }
 
-    list(\$variables, \$defaults, \$tokens) = \$this->\$method();
+    list(\$variables, \$defaults, \$requirements, \$tokens) = \$this->\$method();
 
-    return \$this->doGenerate(\$variables, \$defaults, \$tokens, \$parameters, \$name, \$absolute);
+    return \$this->doGenerate(\$variables, \$defaults, \$requirements, \$tokens, \$parameters, \$name, \$absolute);
   }
 
 $methods

+ 8 - 2
src/Symfony/Components/Routing/Generator/UrlGenerator.php

@@ -64,10 +64,10 @@ class UrlGenerator implements UrlGeneratorInterface
       $this->cache[$name] = $route->compile();
     }
 
-    return $this->doGenerate($this->cache[$name]->getVariables(), $route->getDefaults(), $this->cache[$name]->getTokens(), $parameters, $name, $absolute);
+    return $this->doGenerate($this->cache[$name]->getVariables(), $route->getDefaults(), $route->getRequirements(), $this->cache[$name]->getTokens(), $parameters, $name, $absolute);
   }
 
-  protected function doGenerate($variables, $defaults, $tokens, $parameters, $name, $absolute)
+  protected function doGenerate($variables, $defaults, $requirements, $tokens, $parameters, $name, $absolute)
   {
     $defaults = array_merge($this->defaults, $defaults);
     $tparams = array_merge($defaults, $parameters);
@@ -86,6 +86,12 @@ class UrlGenerator implements UrlGeneratorInterface
       {
         if (false === $optional || !isset($defaults[$token[3]]) || (isset($parameters[$token[3]]) && $parameters[$token[3]] != $defaults[$token[3]]))
         {
+          // check requirement
+          if (isset($requirements[$token[3]]) && !preg_match('#^'.$requirements[$token[3]].'$#', $tparams[$token[3]]))
+          {
+            throw new \InvalidArgumentException(sprintf('Parameter "%s" for route "%s" must match "%s" ("%s" given).', $token[3], $name, $requirements[$token[3]], $tparams[$token[3]]));
+          }
+
           $url = $token[1].urlencode($tparams[$token[3]]).$url;
           $optional = false;
         }