comparison vendor/symfony/routing/RouteCollection.php @ 0:c75dbcec494b

Initial commit from drush-created site
author Chris Cannam
date Thu, 05 Jul 2018 14:24:15 +0000
parents
children a9cd425dd02b
comparison
equal deleted inserted replaced
-1:000000000000 0:c75dbcec494b
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 * When adding a route at the end of the collection, an existing route
20 * with the same name is removed first. So there can only be one route
21 * with a given name.
22 *
23 * @author Fabien Potencier <fabien@symfony.com>
24 * @author Tobias Schultze <http://tobion.de>
25 */
26 class RouteCollection implements \IteratorAggregate, \Countable
27 {
28 /**
29 * @var Route[]
30 */
31 private $routes = array();
32
33 /**
34 * @var array
35 */
36 private $resources = array();
37
38 public function __clone()
39 {
40 foreach ($this->routes as $name => $route) {
41 $this->routes[$name] = clone $route;
42 }
43 }
44
45 /**
46 * Gets the current RouteCollection as an Iterator that includes all routes.
47 *
48 * It implements \IteratorAggregate.
49 *
50 * @see all()
51 *
52 * @return \ArrayIterator|Route[] An \ArrayIterator object for iterating over routes
53 */
54 public function getIterator()
55 {
56 return new \ArrayIterator($this->routes);
57 }
58
59 /**
60 * Gets the number of Routes in this collection.
61 *
62 * @return int The number of routes
63 */
64 public function count()
65 {
66 return count($this->routes);
67 }
68
69 /**
70 * Adds a route.
71 *
72 * @param string $name The route name
73 * @param Route $route A Route instance
74 */
75 public function add($name, Route $route)
76 {
77 unset($this->routes[$name]);
78
79 $this->routes[$name] = $route;
80 }
81
82 /**
83 * Returns all routes in this collection.
84 *
85 * @return Route[] An array of routes
86 */
87 public function all()
88 {
89 return $this->routes;
90 }
91
92 /**
93 * Gets a route by name.
94 *
95 * @param string $name The route name
96 *
97 * @return Route|null A Route instance or null when not found
98 */
99 public function get($name)
100 {
101 return isset($this->routes[$name]) ? $this->routes[$name] : null;
102 }
103
104 /**
105 * Removes a route or an array of routes by name from the collection.
106 *
107 * @param string|string[] $name The route name or an array of route names
108 */
109 public function remove($name)
110 {
111 foreach ((array) $name as $n) {
112 unset($this->routes[$n]);
113 }
114 }
115
116 /**
117 * Adds a route collection at the end of the current set by appending all
118 * routes of the added collection.
119 */
120 public function addCollection(self $collection)
121 {
122 // we need to remove all routes with the same names first because just replacing them
123 // would not place the new route at the end of the merged array
124 foreach ($collection->all() as $name => $route) {
125 unset($this->routes[$name]);
126 $this->routes[$name] = $route;
127 }
128
129 foreach ($collection->getResources() as $resource) {
130 $this->addResource($resource);
131 }
132 }
133
134 /**
135 * Adds a prefix to the path of all child routes.
136 *
137 * @param string $prefix An optional prefix to add before each pattern of the route collection
138 * @param array $defaults An array of default values
139 * @param array $requirements An array of requirements
140 */
141 public function addPrefix($prefix, array $defaults = array(), array $requirements = array())
142 {
143 $prefix = trim(trim($prefix), '/');
144
145 if ('' === $prefix) {
146 return;
147 }
148
149 foreach ($this->routes as $route) {
150 $route->setPath('/'.$prefix.$route->getPath());
151 $route->addDefaults($defaults);
152 $route->addRequirements($requirements);
153 }
154 }
155
156 /**
157 * Sets the host pattern on all routes.
158 *
159 * @param string $pattern The pattern
160 * @param array $defaults An array of default values
161 * @param array $requirements An array of requirements
162 */
163 public function setHost($pattern, array $defaults = array(), array $requirements = array())
164 {
165 foreach ($this->routes as $route) {
166 $route->setHost($pattern);
167 $route->addDefaults($defaults);
168 $route->addRequirements($requirements);
169 }
170 }
171
172 /**
173 * Sets a condition on all routes.
174 *
175 * Existing conditions will be overridden.
176 *
177 * @param string $condition The condition
178 */
179 public function setCondition($condition)
180 {
181 foreach ($this->routes as $route) {
182 $route->setCondition($condition);
183 }
184 }
185
186 /**
187 * Adds defaults to all routes.
188 *
189 * An existing default value under the same name in a route will be overridden.
190 *
191 * @param array $defaults An array of default values
192 */
193 public function addDefaults(array $defaults)
194 {
195 if ($defaults) {
196 foreach ($this->routes as $route) {
197 $route->addDefaults($defaults);
198 }
199 }
200 }
201
202 /**
203 * Adds requirements to all routes.
204 *
205 * An existing requirement under the same name in a route will be overridden.
206 *
207 * @param array $requirements An array of requirements
208 */
209 public function addRequirements(array $requirements)
210 {
211 if ($requirements) {
212 foreach ($this->routes as $route) {
213 $route->addRequirements($requirements);
214 }
215 }
216 }
217
218 /**
219 * Adds options to all routes.
220 *
221 * An existing option value under the same name in a route will be overridden.
222 *
223 * @param array $options An array of options
224 */
225 public function addOptions(array $options)
226 {
227 if ($options) {
228 foreach ($this->routes as $route) {
229 $route->addOptions($options);
230 }
231 }
232 }
233
234 /**
235 * Sets the schemes (e.g. 'https') all child routes are restricted to.
236 *
237 * @param string|string[] $schemes The scheme or an array of schemes
238 */
239 public function setSchemes($schemes)
240 {
241 foreach ($this->routes as $route) {
242 $route->setSchemes($schemes);
243 }
244 }
245
246 /**
247 * Sets the HTTP methods (e.g. 'POST') all child routes are restricted to.
248 *
249 * @param string|string[] $methods The method or an array of methods
250 */
251 public function setMethods($methods)
252 {
253 foreach ($this->routes as $route) {
254 $route->setMethods($methods);
255 }
256 }
257
258 /**
259 * Returns an array of resources loaded to build this collection.
260 *
261 * @return ResourceInterface[] An array of resources
262 */
263 public function getResources()
264 {
265 return array_values($this->resources);
266 }
267
268 /**
269 * Adds a resource for this collection. If the resource already exists
270 * it is not added.
271 */
272 public function addResource(ResourceInterface $resource)
273 {
274 $key = (string) $resource;
275
276 if (!isset($this->resources[$key])) {
277 $this->resources[$key] = $resource;
278 }
279 }
280 }