vendor/symfony/src/Symfony/Component/Routing/RouteCollection.php
changeset 0 7f95f8617b0b
equal deleted inserted replaced
-1:000000000000 0:7f95f8617b0b
       
     1 <?php
       
     2 
       
     3 /*
       
     4  * This file is part of the Symfony package.
       
     5  *
       
     6  * (c) Fabien Potencier <fabien@symfony.com>
       
     7  *
       
     8  * For the full copyright and license information, please view the LICENSE
       
     9  * file that was distributed with this source code.
       
    10  */
       
    11 
       
    12 namespace Symfony\Component\Routing;
       
    13 
       
    14 use Symfony\Component\Config\Resource\ResourceInterface;
       
    15 
       
    16 /**
       
    17  * A RouteCollection represents a set of Route instances.
       
    18  *
       
    19  * @author Fabien Potencier <fabien@symfony.com>
       
    20  *
       
    21  * @api
       
    22  */
       
    23 class RouteCollection implements \IteratorAggregate
       
    24 {
       
    25     private $routes;
       
    26     private $resources;
       
    27     private $prefix;
       
    28 
       
    29     /**
       
    30      * Constructor.
       
    31      *
       
    32      * @api
       
    33      */
       
    34     public function __construct()
       
    35     {
       
    36         $this->routes = array();
       
    37         $this->resources = array();
       
    38         $this->prefix = '';
       
    39     }
       
    40 
       
    41     public function getIterator()
       
    42     {
       
    43         return new \ArrayIterator($this->routes);
       
    44     }
       
    45 
       
    46     /**
       
    47      * Adds a route.
       
    48      *
       
    49      * @param string $name  The route name
       
    50      * @param Route  $route A Route instance
       
    51      *
       
    52      * @throws \InvalidArgumentException When route name contains non valid characters
       
    53      *
       
    54      * @api
       
    55      */
       
    56     public function add($name, Route $route)
       
    57     {
       
    58         if (!preg_match('/^[a-z0-9A-Z_.]+$/', $name)) {
       
    59             throw new \InvalidArgumentException(sprintf('Name "%s" contains non valid characters for a route name.', $name));
       
    60         }
       
    61 
       
    62         $this->routes[$name] = $route;
       
    63     }
       
    64 
       
    65     /**
       
    66      * Returns the array of routes.
       
    67      *
       
    68      * @return array An array of routes
       
    69      */
       
    70     public function all()
       
    71     {
       
    72         $routes = array();
       
    73         foreach ($this->routes as $name => $route) {
       
    74             if ($route instanceof RouteCollection) {
       
    75                 $routes = array_merge($routes, $route->all());
       
    76             } else {
       
    77                 $routes[$name] = $route;
       
    78             }
       
    79         }
       
    80 
       
    81         return $routes;
       
    82     }
       
    83 
       
    84     /**
       
    85      * Gets a route by name.
       
    86      *
       
    87      * @param  string $name  The route name
       
    88      *
       
    89      * @return Route  $route A Route instance
       
    90      */
       
    91     public function get($name)
       
    92     {
       
    93         // get the latest defined route
       
    94         foreach (array_reverse($this->routes) as $routes) {
       
    95             if (!$routes instanceof RouteCollection) {
       
    96                 continue;
       
    97             }
       
    98 
       
    99             if (null !== $route = $routes->get($name)) {
       
   100                 return $route;
       
   101             }
       
   102         }
       
   103 
       
   104         if (isset($this->routes[$name])) {
       
   105             return $this->routes[$name];
       
   106         }
       
   107     }
       
   108 
       
   109     /**
       
   110      * Adds a route collection to the current set of routes (at the end of the current set).
       
   111      *
       
   112      * @param RouteCollection $collection A RouteCollection instance
       
   113      * @param string          $prefix     An optional prefix to add before each pattern of the route collection
       
   114      *
       
   115      * @api
       
   116      */
       
   117     public function addCollection(RouteCollection $collection, $prefix = '')
       
   118     {
       
   119         $collection->addPrefix($prefix);
       
   120 
       
   121         $this->routes[] = $collection;
       
   122     }
       
   123 
       
   124     /**
       
   125      * Adds a prefix to all routes in the current set.
       
   126      *
       
   127      * @param string          $prefix     An optional prefix to add before each pattern of the route collection
       
   128      *
       
   129      * @api
       
   130      */
       
   131     public function addPrefix($prefix)
       
   132     {
       
   133         // a prefix must not end with a slash
       
   134         $prefix = rtrim($prefix, '/');
       
   135 
       
   136         if (!$prefix) {
       
   137             return;
       
   138         }
       
   139 
       
   140         // a prefix must start with a slash
       
   141         if ('/' !== $prefix[0]) {
       
   142             $prefix = '/'.$prefix;
       
   143         }
       
   144 
       
   145         $this->prefix = $prefix.$this->prefix;
       
   146 
       
   147         foreach ($this->routes as $name => $route) {
       
   148             if ($route instanceof RouteCollection) {
       
   149                 $route->addPrefix($prefix);
       
   150             } else {
       
   151                 $route->setPattern($prefix.$route->getPattern());
       
   152             }
       
   153         }
       
   154     }
       
   155 
       
   156     public function getPrefix()
       
   157     {
       
   158         return $this->prefix;
       
   159     }
       
   160 
       
   161     /**
       
   162      * Returns an array of resources loaded to build this collection.
       
   163      *
       
   164      * @return ResourceInterface[] An array of resources
       
   165      */
       
   166     public function getResources()
       
   167     {
       
   168         $resources = $this->resources;
       
   169         foreach ($this as $routes) {
       
   170             if ($routes instanceof RouteCollection) {
       
   171                 $resources = array_merge($resources, $routes->getResources());
       
   172             }
       
   173         }
       
   174 
       
   175         return array_unique($resources);
       
   176     }
       
   177 
       
   178     /**
       
   179      * Adds a resource for this collection.
       
   180      *
       
   181      * @param ResourceInterface $resource A resource instance
       
   182      */
       
   183     public function addResource(ResourceInterface $resource)
       
   184     {
       
   185         $this->resources[] = $resource;
       
   186     }
       
   187 }