瀏覽代碼

Merge branch 'master' of github.com:fabpot/symfony

* 'master' of github.com:fabpot/symfony:
  [Console] added __get() to Command to have shorter and more readable code in commands
  [Console] fixed default message layout
  [Routing] added requirements checking when generating a route
  [Routing] changed matching to only check for method if it is available in the context
  [Routing] fixed typo
Fabien Potencier 15 年之前
父節點
當前提交
e17c43d7b2

+ 1 - 1
src/Symfony/Components/Console/Application.php

@@ -255,7 +255,7 @@ class Application
 
     foreach ($this->definition->getOptions() as $option)
     {
-      $messages[] = sprintf('  %-24s %s  %s',
+      $messages[] = sprintf('  %-29s %s %s',
         '<info>--'.$option->getName().'</info>',
         $option->getShortcut() ? '<info>-'.$option->getShortcut().'</info>' : '  ',
         $option->getDescription()

+ 14 - 0
src/Symfony/Components/Console/Command/Command.php

@@ -423,6 +423,20 @@ class Command
     return $this->application->getHelperSet()->get($name);
   }
 
+  /**
+   * Gets a helper instance by name.
+   *
+   * @param string $name The helper name
+   *
+   * @return mixed The helper value
+   *
+   * @throws \InvalidArgumentException if the helper is not defined
+   */
+  public function __get($name)
+  {
+    return $this->application->getHelperSet()->get($name);
+  }
+
   /**
    * Returns a text representation of the command.
    *

+ 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

+ 9 - 3
src/Symfony/Components/Routing/Generator/UrlGenerator.php

@@ -38,7 +38,7 @@ class UrlGenerator implements UrlGeneratorInterface
   public function __construct(RouteCollection $routes, array $context = array(), array $defaults = array())
   {
     $this->routes = $routes;
-    $this->context = array_merge(array('base_url', ''), $context);
+    $this->context = array_merge(array('base_url' => ''), $context);
     $this->defaults = $defaults;
     $this->cache = array();
   }
@@ -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;
         }

+ 1 - 1
src/Symfony/Components/Routing/Matcher/UrlMatcher.php

@@ -59,7 +59,7 @@ class UrlMatcher implements UrlMatcherInterface
       $compiledRoute = $route->compile();
 
       // check HTTP method requirement
-      if (!isset($this->context['method']) || (($req = $route->getRequirement('_method')) && !in_array(strtolower($this->context['method']), array_map('strtolower', (array) $req))))
+      if (isset($this->context['method']) && (($req = $route->getRequirement('_method')) && !in_array(strtolower($this->context['method']), array_map('strtolower', (array) $req))))
       {
         continue;
       }