Verzeichnisstruktur phpBB-3.3.15


Veröffentlicht
28.08.2024

So funktioniert es


Auf das letzte Element klicken. Dies geht jeweils ein Schritt zurück

Auf das Icon klicken, dies öffnet das Verzeichnis. Nochmal klicken schließt das Verzeichnis.
Auf den Verzeichnisnamen klicken, dies zeigt nur das Verzeichnis mit Inhalt an

(Beispiel Datei-Icons)

Auf das Icon klicken um den Quellcode anzuzeigen

RouteCollectionBuilder.php

Zuletzt modifiziert: 02.04.2025, 15:02 - Dateigröße: 9.57 KiB


001  <?php
002   
003  /*
004   * This file is part of the Symfony package.
005   *
006   * (c) Fabien Potencier <fabien@symfony.com>
007   *
008   * For the full copyright and license information, please view the LICENSE
009   * file that was distributed with this source code.
010   */
011   
012  namespace Symfony\Component\Routing;
013   
014  use Symfony\Component\Config\Exception\FileLoaderLoadException;
015  use Symfony\Component\Config\Loader\LoaderInterface;
016  use Symfony\Component\Config\Resource\ResourceInterface;
017   
018  /**
019   * Helps add and import routes into a RouteCollection.
020   *
021   * @author Ryan Weaver <ryan@knpuniversity.com>
022   */
023  class RouteCollectionBuilder
024  {
025      /**
026       * @var Route[]|RouteCollectionBuilder[]
027       */
028      private $routes = [];
029   
030      private $loader;
031      private $defaults = [];
032      private $prefix;
033      private $host;
034      private $condition;
035      private $requirements = [];
036      private $options = [];
037      private $schemes;
038      private $methods;
039      private $resources = [];
040   
041      public function __construct(LoaderInterface $loader = null)
042      {
043          $this->loader = $loader;
044      }
045   
046      /**
047       * Import an external routing resource and returns the RouteCollectionBuilder.
048       *
049       *     $routes->import('blog.yml', '/blog');
050       *
051       * @param mixed       $resource
052       * @param string|null $prefix
053       * @param string      $type
054       *
055       * @return self
056       *
057       * @throws FileLoaderLoadException
058       */
059      public function import($resource, $prefix = '/', $type = null)
060      {
061          /** @var RouteCollection[] $collection */
062          $collections = $this->load($resource, $type);
063   
064          // create a builder from the RouteCollection
065          $builder = $this->createBuilder();
066   
067          foreach ($collections as $collection) {
068              if (null === $collection) {
069                  continue;
070              }
071   
072              foreach ($collection->all() as $name => $route) {
073                  $builder->addRoute($route, $name);
074              }
075   
076              foreach ($collection->getResources() as $resource) {
077                  $builder->addResource($resource);
078              }
079          }
080   
081          // mount into this builder
082          $this->mount($prefix, $builder);
083   
084          return $builder;
085      }
086   
087      /**
088       * Adds a route and returns it for future modification.
089       *
090       * @param string      $path       The route path
091       * @param string      $controller The route's controller
092       * @param string|null $name       The name to give this route
093       *
094       * @return Route
095       */
096      public function add($path, $controller, $name = null)
097      {
098          $route = new Route($path);
099          $route->setDefault('_controller', $controller);
100          $this->addRoute($route, $name);
101   
102          return $route;
103      }
104   
105      /**
106       * Returns a RouteCollectionBuilder that can be configured and then added with mount().
107       *
108       * @return self
109       */
110      public function createBuilder()
111      {
112          return new self($this->loader);
113      }
114   
115      /**
116       * Add a RouteCollectionBuilder.
117       *
118       * @param string                 $prefix
119       * @param RouteCollectionBuilder $builder
120       */
121      public function mount($prefix, self $builder)
122      {
123          $builder->prefix = trim(trim($prefix), '/');
124          $this->routes[] = $builder;
125      }
126   
127      /**
128       * Adds a Route object to the builder.
129       *
130       * @param string|null $name
131       *
132       * @return $this
133       */
134      public function addRoute(Route $route, $name = null)
135      {
136          if (null === $name) {
137              // used as a flag to know which routes will need a name later
138              $name = '_unnamed_route_'.spl_object_hash($route);
139          }
140   
141          $this->routes[$name] = $route;
142   
143          return $this;
144      }
145   
146      /**
147       * Sets the host on all embedded routes (unless already set).
148       *
149       * @param string $pattern
150       *
151       * @return $this
152       */
153      public function setHost($pattern)
154      {
155          $this->host = $pattern;
156   
157          return $this;
158      }
159   
160      /**
161       * Sets a condition on all embedded routes (unless already set).
162       *
163       * @param string $condition
164       *
165       * @return $this
166       */
167      public function setCondition($condition)
168      {
169          $this->condition = $condition;
170   
171          return $this;
172      }
173   
174      /**
175       * Sets a default value that will be added to all embedded routes (unless that
176       * default value is already set).
177       *
178       * @param string $key
179       * @param mixed  $value
180       *
181       * @return $this
182       */
183      public function setDefault($key, $value)
184      {
185          $this->defaults[$key] = $value;
186   
187          return $this;
188      }
189   
190      /**
191       * Sets a requirement that will be added to all embedded routes (unless that
192       * requirement is already set).
193       *
194       * @param string $key
195       * @param mixed  $regex
196       *
197       * @return $this
198       */
199      public function setRequirement($key, $regex)
200      {
201          $this->requirements[$key] = $regex;
202   
203          return $this;
204      }
205   
206      /**
207       * Sets an option that will be added to all embedded routes (unless that
208       * option is already set).
209       *
210       * @param string $key
211       * @param mixed  $value
212       *
213       * @return $this
214       */
215      public function setOption($key, $value)
216      {
217          $this->options[$key] = $value;
218   
219          return $this;
220      }
221   
222      /**
223       * Sets the schemes on all embedded routes (unless already set).
224       *
225       * @param array|string $schemes
226       *
227       * @return $this
228       */
229      public function setSchemes($schemes)
230      {
231          $this->schemes = $schemes;
232   
233          return $this;
234      }
235   
236      /**
237       * Sets the methods on all embedded routes (unless already set).
238       *
239       * @param array|string $methods
240       *
241       * @return $this
242       */
243      public function setMethods($methods)
244      {
245          $this->methods = $methods;
246   
247          return $this;
248      }
249   
250      /**
251       * Adds a resource for this collection.
252       *
253       * @return $this
254       */
255      private function addResource(ResourceInterface $resource)
256      {
257          $this->resources[] = $resource;
258   
259          return $this;
260      }
261   
262      /**
263       * Creates the final RouteCollection and returns it.
264       *
265       * @return RouteCollection
266       */
267      public function build()
268      {
269          $routeCollection = new RouteCollection();
270   
271          foreach ($this->routes as $name => $route) {
272              if ($route instanceof Route) {
273                  $route->setDefaults(array_merge($this->defaults, $route->getDefaults()));
274                  $route->setOptions(array_merge($this->options, $route->getOptions()));
275   
276                  foreach ($this->requirements as $key => $val) {
277                      if (!$route->hasRequirement($key)) {
278                          $route->setRequirement($key, $val);
279                      }
280                  }
281   
282                  if (null !== $this->prefix) {
283                      $route->setPath('/'.$this->prefix.$route->getPath());
284                  }
285   
286                  if (!$route->getHost()) {
287                      $route->setHost($this->host);
288                  }
289   
290                  if (!$route->getCondition()) {
291                      $route->setCondition($this->condition);
292                  }
293   
294                  if (!$route->getSchemes()) {
295                      $route->setSchemes($this->schemes);
296                  }
297   
298                  if (!$route->getMethods()) {
299                      $route->setMethods($this->methods);
300                  }
301   
302                  // auto-generate the route name if it's been marked
303                  if ('_unnamed_route_' === substr($name, 0, 15)) {
304                      $name = $this->generateRouteName($route);
305                  }
306   
307                  $routeCollection->add($name, $route);
308              } else {
309                  /* @var self $route */
310                  $subCollection = $route->build();
311                  $subCollection->addPrefix($this->prefix);
312   
313                  $routeCollection->addCollection($subCollection);
314              }
315          }
316   
317          foreach ($this->resources as $resource) {
318              $routeCollection->addResource($resource);
319          }
320   
321          return $routeCollection;
322      }
323   
324      /**
325       * Generates a route name based on details of this route.
326       *
327       * @return string
328       */
329      private function generateRouteName(Route $route)
330      {
331          $methods = implode('_', $route->getMethods()).'_';
332   
333          $routeName = $methods.$route->getPath();
334          $routeName = str_replace(['/', ':', '|', '-'], '_', $routeName);
335          $routeName = preg_replace('/[^a-z0-9A-Z_.]+/', '', $routeName);
336   
337          // Collapse consecutive underscores down into a single underscore.
338          $routeName = preg_replace('/_+/', '_', $routeName);
339   
340          return $routeName;
341      }
342   
343      /**
344       * Finds a loader able to load an imported resource and loads it.
345       *
346       * @param mixed       $resource A resource
347       * @param string|null $type     The resource type or null if unknown
348       *
349       * @return RouteCollection[]
350       *
351       * @throws FileLoaderLoadException If no loader is found
352       */
353      private function load($resource, $type = null)
354      {
355          if (null === $this->loader) {
356              throw new \BadMethodCallException('Cannot import other routing resources: you must pass a LoaderInterface when constructing RouteCollectionBuilder.');
357          }
358   
359          if ($this->loader->supports($resource, $type)) {
360              $collections = $this->loader->load($resource, $type);
361   
362              return \is_array($collections) ? $collections : [$collections];
363          }
364   
365          if (null === $resolver = $this->loader->getResolver()) {
366              throw new FileLoaderLoadException($resource, null, null, null, $type);
367          }
368   
369          if (false === $loader = $resolver->resolve($resource, $type)) {
370              throw new FileLoaderLoadException($resource, null, null, null, $type);
371          }
372   
373          $collections = $loader->load($resource, $type);
374   
375          return \is_array($collections) ? $collections : [$collections];
376      }
377  }
378