Verzeichnisstruktur phpBB-3.2.0


Veröffentlicht
06.01.2017

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: 09.10.2024, 12:54 - Dateigröße: 9.51 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 = array();
 029   
 030      private $loader;
 031      private $defaults = array();
 032      private $prefix;
 033      private $host;
 034      private $condition;
 035      private $requirements = array();
 036      private $options = array();
 037      private $schemes;
 038      private $methods;
 039      private $resources = array();
 040   
 041      /**
 042       * @param LoaderInterface $loader
 043       */
 044      public function __construct(LoaderInterface $loader = null)
 045      {
 046          $this->loader = $loader;
 047      }
 048   
 049      /**
 050       * Import an external routing resource and returns the RouteCollectionBuilder.
 051       *
 052       *  $routes->import('blog.yml', '/blog');
 053       *
 054       * @param mixed       $resource
 055       * @param string|null $prefix
 056       * @param string      $type
 057       *
 058       * @return RouteCollectionBuilder
 059       *
 060       * @throws FileLoaderLoadException
 061       */
 062      public function import($resource, $prefix = '/', $type = null)
 063      {
 064          /** @var RouteCollection $collection */
 065          $collection = $this->load($resource, $type);
 066   
 067          // create a builder from the RouteCollection
 068          $builder = $this->createBuilder();
 069          foreach ($collection->all() as $name => $route) {
 070              $builder->addRoute($route, $name);
 071          }
 072   
 073          foreach ($collection->getResources() as $resource) {
 074              $builder->addResource($resource);
 075          }
 076   
 077          // mount into this builder
 078          $this->mount($prefix, $builder);
 079   
 080          return $builder;
 081      }
 082   
 083      /**
 084       * Adds a route and returns it for future modification.
 085       *
 086       * @param string      $path       The route path
 087       * @param string      $controller The route's controller
 088       * @param string|null $name       The name to give this route
 089       *
 090       * @return Route
 091       */
 092      public function add($path, $controller, $name = null)
 093      {
 094          $route = new Route($path);
 095          $route->setDefault('_controller', $controller);
 096          $this->addRoute($route, $name);
 097   
 098          return $route;
 099      }
 100   
 101      /**
 102       * Returns a RouteCollectionBuilder that can be configured and then added with mount().
 103       *
 104       * @return RouteCollectionBuilder
 105       */
 106      public function createBuilder()
 107      {
 108          return new self($this->loader);
 109      }
 110   
 111      /**
 112       * Add a RouteCollectionBuilder.
 113       *
 114       * @param string                 $prefix
 115       * @param RouteCollectionBuilder $builder
 116       */
 117      public function mount($prefix, RouteCollectionBuilder $builder)
 118      {
 119          $builder->prefix = trim(trim($prefix), '/');
 120          $this->routes[] = $builder;
 121      }
 122   
 123      /**
 124       * Adds a Route object to the builder.
 125       *
 126       * @param Route       $route
 127       * @param string|null $name
 128       *
 129       * @return $this
 130       */
 131      public function addRoute(Route $route, $name = null)
 132      {
 133          if (null === $name) {
 134              // used as a flag to know which routes will need a name later
 135              $name = '_unnamed_route_'.spl_object_hash($route);
 136          }
 137   
 138          $this->routes[$name] = $route;
 139   
 140          return $this;
 141      }
 142   
 143      /**
 144       * Sets the host on all embedded routes (unless already set).
 145       *
 146       * @param string $pattern
 147       *
 148       * @return $this
 149       */
 150      public function setHost($pattern)
 151      {
 152          $this->host = $pattern;
 153   
 154          return $this;
 155      }
 156   
 157      /**
 158       * Sets a condition on all embedded routes (unless already set).
 159       *
 160       * @param string $condition
 161       *
 162       * @return $this
 163       */
 164      public function setCondition($condition)
 165      {
 166          $this->condition = $condition;
 167   
 168          return $this;
 169      }
 170   
 171      /**
 172       * Sets a default value that will be added to all embedded routes (unless that
 173       * default value is already set).
 174       *
 175       * @param string $key
 176       * @param mixed  $value
 177       *
 178       * @return $this
 179       */
 180      public function setDefault($key, $value)
 181      {
 182          $this->defaults[$key] = $value;
 183   
 184          return $this;
 185      }
 186   
 187      /**
 188       * Sets a requirement that will be added to all embedded routes (unless that
 189       * requirement is already set).
 190       *
 191       * @param string $key
 192       * @param mixed  $regex
 193       *
 194       * @return $this
 195       */
 196      public function setRequirement($key, $regex)
 197      {
 198          $this->requirements[$key] = $regex;
 199   
 200          return $this;
 201      }
 202   
 203      /**
 204       * Sets an opiton that will be added to all embedded routes (unless that
 205       * option is already set).
 206       *
 207       * @param string $key
 208       * @param mixed  $value
 209       *
 210       * @return $this
 211       */
 212      public function setOption($key, $value)
 213      {
 214          $this->options[$key] = $value;
 215   
 216          return $this;
 217      }
 218   
 219      /**
 220       * Sets the schemes on all embedded routes (unless already set).
 221       *
 222       * @param array|string $schemes
 223       *
 224       * @return $this
 225       */
 226      public function setSchemes($schemes)
 227      {
 228          $this->schemes = $schemes;
 229   
 230          return $this;
 231      }
 232   
 233      /**
 234       * Sets the methods on all embedded routes (unless already set).
 235       *
 236       * @param array|string $methods
 237       *
 238       * @return $this
 239       */
 240      public function setMethods($methods)
 241      {
 242          $this->methods = $methods;
 243   
 244          return $this;
 245      }
 246   
 247      /**
 248       * Adds a resource for this collection.
 249       *
 250       * @param ResourceInterface $resource
 251       *
 252       * @return $this
 253       */
 254      private function addResource(ResourceInterface $resource)
 255      {
 256          $this->resources[] = $resource;
 257   
 258          return $this;
 259      }
 260   
 261      /**
 262       * Creates the final RouteCollection and returns it.
 263       *
 264       * @return RouteCollection
 265       */
 266      public function build()
 267      {
 268          $routeCollection = new RouteCollection();
 269   
 270          foreach ($this->routes as $name => $route) {
 271              if ($route instanceof Route) {
 272                  $route->setDefaults(array_merge($this->defaults, $route->getDefaults()));
 273                  $route->setOptions(array_merge($this->options, $route->getOptions()));
 274   
 275                  // we're extra careful here to avoid re-setting deprecated _method and _scheme
 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              foreach ($this->resources as $resource) {
 317                  $routeCollection->addResource($resource);
 318              }
 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(array('/', ':', '|', '-'), '_', $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              return $this->loader->load($resource, $type);
 361          }
 362   
 363          if (null === $resolver = $this->loader->getResolver()) {
 364              throw new FileLoaderLoadException($resource);
 365          }
 366   
 367          if (false === $loader = $resolver->resolve($resource, $type)) {
 368              throw new FileLoaderLoadException($resource);
 369          }
 370   
 371          return $loader->load($resource, $type);
 372      }
 373  }
 374