123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118 |
- <?php
- /*
- * This file is part of the Symfony package.
- *
- * (c) Fabien Potencier <fabien@symfony.com>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
- namespace Symfony\Component\Routing\Matcher;
- use Symfony\Component\Routing\Exception\MethodNotAllowedException;
- /**
- * ApacheUrlMatcher matches URL based on Apache mod_rewrite matching (see ApacheMatcherDumper).
- *
- * @author Fabien Potencier <fabien@symfony.com>
- * @author Arnaud Le Blanc <arnaud.lb@gmail.com>
- */
- class ApacheUrlMatcher extends UrlMatcher
- {
- /**
- * Tries to match a URL based on Apache mod_rewrite matching.
- *
- * Returns false if no route matches the URL.
- *
- * @param string $pathinfo The pathinfo to be parsed
- *
- * @return array An array of parameters
- *
- * @throws MethodNotAllowedException If the current method is not allowed
- */
- public function match($pathinfo)
- {
- $parameters = array();
- $defaults = array();
- $allow = array();
- $route = null;
- foreach ($this->denormalizeValues($_SERVER) as $key => $value) {
- $name = $key;
- // skip non-routing variables
- // this improves performance when $_SERVER contains many usual
- // variables like HTTP_*, DOCUMENT_ROOT, REQUEST_URI, ...
- if (false === strpos($name, '_ROUTING_')) {
- continue;
- }
- while (0 === strpos($name, 'REDIRECT_')) {
- $name = substr($name, 9);
- }
- // expect _ROUTING_<type>_<name>
- // or _ROUTING_<type>
- if (0 !== strpos($name, '_ROUTING_')) {
- continue;
- }
- if (false !== $pos = strpos($name, '_', 9)) {
- $type = substr($name, 9, $pos-9);
- $name = substr($name, $pos+1);
- } else {
- $type = substr($name, 9);
- }
- if ('param' === $type) {
- if ('' !== $value) {
- $parameters[$name] = $value;
- }
- } elseif ('default' === $type) {
- $defaults[$name] = $value;
- } elseif ('route' === $type) {
- $route = $value;
- } elseif ('allow' === $type) {
- $allow[] = $name;
- }
- unset($_SERVER[$key]);
- }
- if (null !== $route) {
- $parameters['_route'] = $route;
- return $this->mergeDefaults($parameters, $defaults);
- } elseif (0 < count($allow)) {
- throw new MethodNotAllowedException($allow);
- } else {
- return parent::match($pathinfo);
- }
- }
- /**
- * Denormalizes an array of values.
- *
- * @param string[] $values
- *
- * @return array
- */
- private function denormalizeValues(array $values)
- {
- $normalizedValues = array();
- foreach ($values as $key => $value) {
- if (preg_match('~^(.*)\[(\d+)\]$~', $key, $matches)) {
- if (!isset($normalizedValues[$matches[1]])) {
- $normalizedValues[$matches[1]] = array();
- }
- $normalizedValues[$matches[1]][(int) $matches[2]] = $value;
- } else {
- $normalizedValues[$key] = $value;
- }
- }
- return $normalizedValues;
- }
- }
|