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

Router.php

Zuletzt modifiziert: 09.10.2024, 12:54 - Dateigröße: 13.07 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\Loader\LoaderInterface;
015  use Symfony\Component\Config\ConfigCacheInterface;
016  use Symfony\Component\Config\ConfigCacheFactoryInterface;
017  use Symfony\Component\Config\ConfigCacheFactory;
018  use Psr\Log\LoggerInterface;
019  use Symfony\Component\Routing\Generator\ConfigurableRequirementsInterface;
020  use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
021  use Symfony\Component\Routing\Generator\Dumper\GeneratorDumperInterface;
022  use Symfony\Component\Routing\Matcher\RequestMatcherInterface;
023  use Symfony\Component\Routing\Matcher\UrlMatcherInterface;
024  use Symfony\Component\Routing\Matcher\Dumper\MatcherDumperInterface;
025  use Symfony\Component\HttpFoundation\Request;
026  use Symfony\Component\ExpressionLanguage\ExpressionFunctionProviderInterface;
027   
028  /**
029   * The Router class is an example of the integration of all pieces of the
030   * routing system for easier use.
031   *
032   * @author Fabien Potencier <fabien@symfony.com>
033   */
034  class Router implements RouterInterface, RequestMatcherInterface
035  {
036      /**
037       * @var UrlMatcherInterface|null
038       */
039      protected $matcher;
040   
041      /**
042       * @var UrlGeneratorInterface|null
043       */
044      protected $generator;
045   
046      /**
047       * @var RequestContext
048       */
049      protected $context;
050   
051      /**
052       * @var LoaderInterface
053       */
054      protected $loader;
055   
056      /**
057       * @var RouteCollection|null
058       */
059      protected $collection;
060   
061      /**
062       * @var mixed
063       */
064      protected $resource;
065   
066      /**
067       * @var array
068       */
069      protected $options = array();
070   
071      /**
072       * @var LoggerInterface|null
073       */
074      protected $logger;
075   
076      /**
077       * @var ConfigCacheFactoryInterface|null
078       */
079      private $configCacheFactory;
080   
081      /**
082       * @var ExpressionFunctionProviderInterface[]
083       */
084      private $expressionLanguageProviders = array();
085   
086      /**
087       * Constructor.
088       *
089       * @param LoaderInterface $loader   A LoaderInterface instance
090       * @param mixed           $resource The main resource to load
091       * @param array           $options  An array of options
092       * @param RequestContext  $context  The context
093       * @param LoggerInterface $logger   A logger instance
094       */
095      public function __construct(LoaderInterface $loader, $resource, array $options = array(), RequestContext $context = null, LoggerInterface $logger = null)
096      {
097          $this->loader = $loader;
098          $this->resource = $resource;
099          $this->logger = $logger;
100          $this->context = $context ?: new RequestContext();
101          $this->setOptions($options);
102      }
103   
104      /**
105       * Sets options.
106       *
107       * Available options:
108       *
109       *   * cache_dir:              The cache directory (or null to disable caching)
110       *   * debug:                  Whether to enable debugging or not (false by default)
111       *   * generator_class:        The name of a UrlGeneratorInterface implementation
112       *   * generator_base_class:   The base class for the dumped generator class
113       *   * generator_cache_class:  The class name for the dumped generator class
114       *   * generator_dumper_class: The name of a GeneratorDumperInterface implementation
115       *   * matcher_class:          The name of a UrlMatcherInterface implementation
116       *   * matcher_base_class:     The base class for the dumped matcher class
117       *   * matcher_dumper_class:   The class name for the dumped matcher class
118       *   * matcher_cache_class:    The name of a MatcherDumperInterface implementation
119       *   * resource_type:          Type hint for the main resource (optional)
120       *   * strict_requirements:    Configure strict requirement checking for generators
121       *                             implementing ConfigurableRequirementsInterface (default is true)
122       *
123       * @param array $options An array of options
124       *
125       * @throws \InvalidArgumentException When unsupported option is provided
126       */
127      public function setOptions(array $options)
128      {
129          $this->options = array(
130              'cache_dir' => null,
131              'debug' => false,
132              'generator_class' => 'Symfony\\Component\\Routing\\Generator\\UrlGenerator',
133              'generator_base_class' => 'Symfony\\Component\\Routing\\Generator\\UrlGenerator',
134              'generator_dumper_class' => 'Symfony\\Component\\Routing\\Generator\\Dumper\\PhpGeneratorDumper',
135              'generator_cache_class' => 'ProjectUrlGenerator',
136              'matcher_class' => 'Symfony\\Component\\Routing\\Matcher\\UrlMatcher',
137              'matcher_base_class' => 'Symfony\\Component\\Routing\\Matcher\\UrlMatcher',
138              'matcher_dumper_class' => 'Symfony\\Component\\Routing\\Matcher\\Dumper\\PhpMatcherDumper',
139              'matcher_cache_class' => 'ProjectUrlMatcher',
140              'resource_type' => null,
141              'strict_requirements' => true,
142          );
143   
144          // check option names and live merge, if errors are encountered Exception will be thrown
145          $invalid = array();
146          foreach ($options as $key => $value) {
147              if (array_key_exists($key, $this->options)) {
148                  $this->options[$key] = $value;
149              } else {
150                  $invalid[] = $key;
151              }
152          }
153   
154          if ($invalid) {
155              throw new \InvalidArgumentException(sprintf('The Router does not support the following options: "%s".', implode('", "', $invalid)));
156          }
157      }
158   
159      /**
160       * Sets an option.
161       *
162       * @param string $key   The key
163       * @param mixed  $value The value
164       *
165       * @throws \InvalidArgumentException
166       */
167      public function setOption($key, $value)
168      {
169          if (!array_key_exists($key, $this->options)) {
170              throw new \InvalidArgumentException(sprintf('The Router does not support the "%s" option.', $key));
171          }
172   
173          $this->options[$key] = $value;
174      }
175   
176      /**
177       * Gets an option value.
178       *
179       * @param string $key The key
180       *
181       * @return mixed The value
182       *
183       * @throws \InvalidArgumentException
184       */
185      public function getOption($key)
186      {
187          if (!array_key_exists($key, $this->options)) {
188              throw new \InvalidArgumentException(sprintf('The Router does not support the "%s" option.', $key));
189          }
190   
191          return $this->options[$key];
192      }
193   
194      /**
195       * {@inheritdoc}
196       */
197      public function getRouteCollection()
198      {
199          if (null === $this->collection) {
200              $this->collection = $this->loader->load($this->resource, $this->options['resource_type']);
201          }
202   
203          return $this->collection;
204      }
205   
206      /**
207       * {@inheritdoc}
208       */
209      public function setContext(RequestContext $context)
210      {
211          $this->context = $context;
212   
213          if (null !== $this->matcher) {
214              $this->getMatcher()->setContext($context);
215          }
216          if (null !== $this->generator) {
217              $this->getGenerator()->setContext($context);
218          }
219      }
220   
221      /**
222       * {@inheritdoc}
223       */
224      public function getContext()
225      {
226          return $this->context;
227      }
228   
229      /**
230       * Sets the ConfigCache factory to use.
231       *
232       * @param ConfigCacheFactoryInterface $configCacheFactory The factory to use
233       */
234      public function setConfigCacheFactory(ConfigCacheFactoryInterface $configCacheFactory)
235      {
236          $this->configCacheFactory = $configCacheFactory;
237      }
238   
239      /**
240       * {@inheritdoc}
241       */
242      public function generate($name, $parameters = array(), $referenceType = self::ABSOLUTE_PATH)
243      {
244          return $this->getGenerator()->generate($name, $parameters, $referenceType);
245      }
246   
247      /**
248       * {@inheritdoc}
249       */
250      public function match($pathinfo)
251      {
252          return $this->getMatcher()->match($pathinfo);
253      }
254   
255      /**
256       * {@inheritdoc}
257       */
258      public function matchRequest(Request $request)
259      {
260          $matcher = $this->getMatcher();
261          if (!$matcher instanceof RequestMatcherInterface) {
262              // fallback to the default UrlMatcherInterface
263              return $matcher->match($request->getPathInfo());
264          }
265   
266          return $matcher->matchRequest($request);
267      }
268   
269      /**
270       * Gets the UrlMatcher instance associated with this Router.
271       *
272       * @return UrlMatcherInterface A UrlMatcherInterface instance
273       */
274      public function getMatcher()
275      {
276          if (null !== $this->matcher) {
277              return $this->matcher;
278          }
279   
280          if (null === $this->options['cache_dir'] || null === $this->options['matcher_cache_class']) {
281              $this->matcher = new $this->options['matcher_class']($this->getRouteCollection(), $this->context);
282              if (method_exists($this->matcher, 'addExpressionLanguageProvider')) {
283                  foreach ($this->expressionLanguageProviders as $provider) {
284                      $this->matcher->addExpressionLanguageProvider($provider);
285                  }
286              }
287   
288              return $this->matcher;
289          }
290   
291          $class = $this->options['matcher_cache_class'];
292          $baseClass = $this->options['matcher_base_class'];
293          $expressionLanguageProviders = $this->expressionLanguageProviders;
294          $that = $this; // required for PHP 5.3 where "$this" cannot be use()d in anonymous functions. Change in Symfony 3.0.
295   
296          $cache = $this->getConfigCacheFactory()->cache($this->options['cache_dir'].'/'.$class.'.php',
297              function (ConfigCacheInterface $cache) use ($that, $class, $baseClass, $expressionLanguageProviders) {
298                  $dumper = $that->getMatcherDumperInstance();
299                  if (method_exists($dumper, 'addExpressionLanguageProvider')) {
300                      foreach ($expressionLanguageProviders as $provider) {
301                          $dumper->addExpressionLanguageProvider($provider);
302                      }
303                  }
304   
305                  $options = array(
306                      'class' => $class,
307                      'base_class' => $baseClass,
308                  );
309   
310                  $cache->write($dumper->dump($options), $that->getRouteCollection()->getResources());
311              }
312          );
313   
314          require_once $cache->getPath();
315   
316          return $this->matcher = new $class($this->context);
317      }
318   
319      /**
320       * Gets the UrlGenerator instance associated with this Router.
321       *
322       * @return UrlGeneratorInterface A UrlGeneratorInterface instance
323       */
324      public function getGenerator()
325      {
326          if (null !== $this->generator) {
327              return $this->generator;
328          }
329   
330          if (null === $this->options['cache_dir'] || null === $this->options['generator_cache_class']) {
331              $this->generator = new $this->options['generator_class']($this->getRouteCollection(), $this->context, $this->logger);
332          } else {
333              $class = $this->options['generator_cache_class'];
334              $baseClass = $this->options['generator_base_class'];
335              $that = $this; // required for PHP 5.3 where "$this" cannot be use()d in anonymous functions. Change in Symfony 3.0.
336              $cache = $this->getConfigCacheFactory()->cache($this->options['cache_dir'].'/'.$class.'.php',
337                  function (ConfigCacheInterface $cache) use ($that, $class, $baseClass) {
338                      $dumper = $that->getGeneratorDumperInstance();
339   
340                      $options = array(
341                          'class' => $class,
342                          'base_class' => $baseClass,
343                      );
344   
345                      $cache->write($dumper->dump($options), $that->getRouteCollection()->getResources());
346                  }
347              );
348   
349              require_once $cache->getPath();
350   
351              $this->generator = new $class($this->context, $this->logger);
352          }
353   
354          if ($this->generator instanceof ConfigurableRequirementsInterface) {
355              $this->generator->setStrictRequirements($this->options['strict_requirements']);
356          }
357   
358          return $this->generator;
359      }
360   
361      public function addExpressionLanguageProvider(ExpressionFunctionProviderInterface $provider)
362      {
363          $this->expressionLanguageProviders[] = $provider;
364      }
365   
366      /**
367       * This method is public because it needs to be callable from a closure in PHP 5.3. It should be converted back to protected in 3.0.
368       *
369       * @internal
370       *
371       * @return GeneratorDumperInterface
372       */
373      public function getGeneratorDumperInstance()
374      {
375          return new $this->options['generator_dumper_class']($this->getRouteCollection());
376      }
377   
378      /**
379       * This method is public because it needs to be callable from a closure in PHP 5.3. It should be converted back to protected in 3.0.
380       *
381       * @internal
382       *
383       * @return MatcherDumperInterface
384       */
385      public function getMatcherDumperInstance()
386      {
387          return new $this->options['matcher_dumper_class']($this->getRouteCollection());
388      }
389   
390      /**
391       * Provides the ConfigCache factory implementation, falling back to a
392       * default implementation if necessary.
393       *
394       * @return ConfigCacheFactoryInterface $configCacheFactory
395       */
396      private function getConfigCacheFactory()
397      {
398          if (null === $this->configCacheFactory) {
399              $this->configCacheFactory = new ConfigCacheFactory($this->options['debug']);
400          }
401   
402          return $this->configCacheFactory;
403      }
404  }
405