123 lines
		
	
	
		
			3.6 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			123 lines
		
	
	
		
			3.6 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
| <?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).
 | |
|  *
 | |
|  * @deprecated Deprecated since version 2.5, to be removed in 3.0.
 | |
|  *             The performance gains are minimal and it's very hard to replicate
 | |
|  *             the behavior of PHP implementation.
 | |
|  *
 | |
|  * @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;
 | |
|     }
 | |
| }
 | 
