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

UrlMatcher.php

Zuletzt modifiziert: 09.10.2024, 12:56 - Dateigröße: 7.39 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\Matcher;
 013   
 014  use Symfony\Component\Routing\Exception\MethodNotAllowedException;
 015  use Symfony\Component\Routing\Exception\ResourceNotFoundException;
 016  use Symfony\Component\Routing\RouteCollection;
 017  use Symfony\Component\Routing\RequestContext;
 018  use Symfony\Component\Routing\Route;
 019  use Symfony\Component\HttpFoundation\Request;
 020  use Symfony\Component\ExpressionLanguage\ExpressionLanguage;
 021  use Symfony\Component\ExpressionLanguage\ExpressionFunctionProviderInterface;
 022   
 023  /**
 024   * UrlMatcher matches URL based on a set of routes.
 025   *
 026   * @author Fabien Potencier <fabien@symfony.com>
 027   */
 028  class UrlMatcher implements UrlMatcherInterface, RequestMatcherInterface
 029  {
 030      const REQUIREMENT_MATCH = 0;
 031      const REQUIREMENT_MISMATCH = 1;
 032      const ROUTE_MATCH = 2;
 033   
 034      /**
 035       * @var RequestContext
 036       */
 037      protected $context;
 038   
 039      /**
 040       * @var array
 041       */
 042      protected $allow = array();
 043   
 044      /**
 045       * @var RouteCollection
 046       */
 047      protected $routes;
 048   
 049      protected $request;
 050      protected $expressionLanguage;
 051   
 052      /**
 053       * @var ExpressionFunctionProviderInterface[]
 054       */
 055      protected $expressionLanguageProviders = array();
 056   
 057      /**
 058       * Constructor.
 059       *
 060       * @param RouteCollection $routes  A RouteCollection instance
 061       * @param RequestContext  $context The context
 062       */
 063      public function __construct(RouteCollection $routes, RequestContext $context)
 064      {
 065          $this->routes = $routes;
 066          $this->context = $context;
 067      }
 068   
 069      /**
 070       * {@inheritdoc}
 071       */
 072      public function setContext(RequestContext $context)
 073      {
 074          $this->context = $context;
 075      }
 076   
 077      /**
 078       * {@inheritdoc}
 079       */
 080      public function getContext()
 081      {
 082          return $this->context;
 083      }
 084   
 085      /**
 086       * {@inheritdoc}
 087       */
 088      public function match($pathinfo)
 089      {
 090          $this->allow = array();
 091   
 092          if ($ret = $this->matchCollection(rawurldecode($pathinfo), $this->routes)) {
 093              return $ret;
 094          }
 095   
 096          throw 0 < count($this->allow)
 097              ? new MethodNotAllowedException(array_unique($this->allow))
 098              : new ResourceNotFoundException(sprintf('No routes found for "%s".', $pathinfo));
 099      }
 100   
 101      /**
 102       * {@inheritdoc}
 103       */
 104      public function matchRequest(Request $request)
 105      {
 106          $this->request = $request;
 107   
 108          $ret = $this->match($request->getPathInfo());
 109   
 110          $this->request = null;
 111   
 112          return $ret;
 113      }
 114   
 115      public function addExpressionLanguageProvider(ExpressionFunctionProviderInterface $provider)
 116      {
 117          $this->expressionLanguageProviders[] = $provider;
 118      }
 119   
 120      /**
 121       * Tries to match a URL with a set of routes.
 122       *
 123       * @param string          $pathinfo The path info to be parsed
 124       * @param RouteCollection $routes   The set of routes
 125       *
 126       * @return array An array of parameters
 127       *
 128       * @throws ResourceNotFoundException If the resource could not be found
 129       * @throws MethodNotAllowedException If the resource was found but the request method is not allowed
 130       */
 131      protected function matchCollection($pathinfo, RouteCollection $routes)
 132      {
 133          foreach ($routes as $name => $route) {
 134              $compiledRoute = $route->compile();
 135   
 136              // check the static prefix of the URL first. Only use the more expensive preg_match when it matches
 137              if ('' !== $compiledRoute->getStaticPrefix() && 0 !== strpos($pathinfo, $compiledRoute->getStaticPrefix())) {
 138                  continue;
 139              }
 140   
 141              if (!preg_match($compiledRoute->getRegex(), $pathinfo, $matches)) {
 142                  continue;
 143              }
 144   
 145              $hostMatches = array();
 146              if ($compiledRoute->getHostRegex() && !preg_match($compiledRoute->getHostRegex(), $this->context->getHost(), $hostMatches)) {
 147                  continue;
 148              }
 149   
 150              // check HTTP method requirement
 151              if ($requiredMethods = $route->getMethods()) {
 152                  // HEAD and GET are equivalent as per RFC
 153                  if ('HEAD' === $method = $this->context->getMethod()) {
 154                      $method = 'GET';
 155                  }
 156   
 157                  if (!in_array($method, $requiredMethods)) {
 158                      $this->allow = array_merge($this->allow, $requiredMethods);
 159   
 160                      continue;
 161                  }
 162              }
 163   
 164              $status = $this->handleRouteRequirements($pathinfo, $name, $route);
 165   
 166              if (self::ROUTE_MATCH === $status[0]) {
 167                  return $status[1];
 168              }
 169   
 170              if (self::REQUIREMENT_MISMATCH === $status[0]) {
 171                  continue;
 172              }
 173   
 174              return $this->getAttributes($route, $name, array_replace($matches, $hostMatches));
 175          }
 176      }
 177   
 178      /**
 179       * Returns an array of values to use as request attributes.
 180       *
 181       * As this method requires the Route object, it is not available
 182       * in matchers that do not have access to the matched Route instance
 183       * (like the PHP and Apache matcher dumpers).
 184       *
 185       * @param Route  $route      The route we are matching against
 186       * @param string $name       The name of the route
 187       * @param array  $attributes An array of attributes from the matcher
 188       *
 189       * @return array An array of parameters
 190       */
 191      protected function getAttributes(Route $route, $name, array $attributes)
 192      {
 193          $attributes['_route'] = $name;
 194   
 195          return $this->mergeDefaults($attributes, $route->getDefaults());
 196      }
 197   
 198      /**
 199       * Handles specific route requirements.
 200       *
 201       * @param string $pathinfo The path
 202       * @param string $name     The route name
 203       * @param Route  $route    The route
 204       *
 205       * @return array The first element represents the status, the second contains additional information
 206       */
 207      protected function handleRouteRequirements($pathinfo, $name, Route $route)
 208      {
 209          // expression condition
 210          if ($route->getCondition() && !$this->getExpressionLanguage()->evaluate($route->getCondition(), array('context' => $this->context, 'request' => $this->request))) {
 211              return array(self::REQUIREMENT_MISMATCH, null);
 212          }
 213   
 214          // check HTTP scheme requirement
 215          $scheme = $this->context->getScheme();
 216          $status = $route->getSchemes() && !$route->hasScheme($scheme) ? self::REQUIREMENT_MISMATCH : self::REQUIREMENT_MATCH;
 217   
 218          return array($status, null);
 219      }
 220   
 221      /**
 222       * Get merged default parameters.
 223       *
 224       * @param array $params   The parameters
 225       * @param array $defaults The defaults
 226       *
 227       * @return array Merged default parameters
 228       */
 229      protected function mergeDefaults($params, $defaults)
 230      {
 231          foreach ($params as $key => $value) {
 232              if (!is_int($key)) {
 233                  $defaults[$key] = $value;
 234              }
 235          }
 236   
 237          return $defaults;
 238      }
 239   
 240      protected function getExpressionLanguage()
 241      {
 242          if (null === $this->expressionLanguage) {
 243              if (!class_exists('Symfony\Component\ExpressionLanguage\ExpressionLanguage')) {
 244                  throw new \RuntimeException('Unable to use expressions as the Symfony ExpressionLanguage component is not installed.');
 245              }
 246              $this->expressionLanguage = new ExpressionLanguage(null, $this->expressionLanguageProviders);
 247          }
 248   
 249          return $this->expressionLanguage;
 250      }
 251  }
 252