Вход Регистрация
Файл: symfony-2.7/src/Symfony/Bundle/FrameworkBundle/Routing/Router.php
Строк: 224
<?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 SymfonyBundleFrameworkBundleRouting;

use 
SymfonyComponentRoutingRouter as BaseRouter;
use 
SymfonyComponentRoutingRequestContext;
use 
SymfonyComponentDependencyInjectionContainerInterface;
use 
SymfonyComponentRoutingRouteCollection;
use 
SymfonyComponentHttpKernelCacheWarmerWarmableInterface;
use 
SymfonyComponentDependencyInjectionExceptionParameterNotFoundException;
use 
SymfonyComponentDependencyInjectionExceptionRuntimeException;

/**
 * This Router creates the Loader only when the cache is empty.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 */
class Router extends BaseRouter implements WarmableInterface
{
    private 
$container;

    
/**
     * Constructor.
     *
     * @param ContainerInterface $container A ContainerInterface instance
     * @param mixed              $resource  The main resource to load
     * @param array              $options   An array of options
     * @param RequestContext     $context   The context
     */
    
public function __construct(ContainerInterface $container$resource, array $options = array(), RequestContext $context null)
    {
        
$this->container $container;

        
$this->resource $resource;
        
$this->context $context ?: new RequestContext();
        
$this->setOptions($options);
    }

    
/**
     * {@inheritdoc}
     */
    
public function getRouteCollection()
    {
        if (
null === $this->collection) {
            
$this->collection $this->container->get('routing.loader')->load($this->resource$this->options['resource_type']);
            
$this->resolveParameters($this->collection);
        }

        return 
$this->collection;
    }

    
/**
     * {@inheritdoc}
     */
    
public function warmUp($cacheDir)
    {
        
$currentDir $this->getOption('cache_dir');

        
// force cache generation
        
$this->setOption('cache_dir'$cacheDir);
        
$this->getMatcher();
        
$this->getGenerator();

        
$this->setOption('cache_dir'$currentDir);
    }

    
/**
     * Replaces placeholders with service container parameter values in:
     * - the route defaults,
     * - the route requirements,
     * - the route path,
     * - the route host,
     * - the route schemes,
     * - the route methods.
     *
     * @param RouteCollection $collection
     */
    
private function resolveParameters(RouteCollection $collection)
    {
        foreach (
$collection as $route) {
            foreach (
$route->getDefaults() as $name => $value) {
                
$route->setDefault($name$this->resolve($value));
            }

            foreach (
$route->getRequirements() as $name => $value) {
                if (
'_scheme' === $name || '_method' === $name) {
                    continue; 
// ignore deprecated requirements to not trigger deprecation warnings
                
}

                
$route->setRequirement($name$this->resolve($value));
            }

            
$route->setPath($this->resolve($route->getPath()));
            
$route->setHost($this->resolve($route->getHost()));

            
$schemes = array();
            foreach (
$route->getSchemes() as $scheme) {
                
$schemes array_merge($schemesexplode('|'$this->resolve($scheme)));
            }
            
$route->setSchemes($schemes);

            
$methods = array();
            foreach (
$route->getMethods() as $method) {
                
$methods array_merge($methodsexplode('|'$this->resolve($method)));
            }
            
$route->setMethods($methods);
            
$route->setCondition($this->resolve($route->getCondition()));
        }
    }

    
/**
     * Recursively replaces placeholders with the service container parameters.
     *
     * @param mixed $value The source which might contain "%placeholders%"
     *
     * @return mixed The source with the placeholders replaced by the container
     *               parameters. Arrays are resolved recursively.
     *
     * @throws ParameterNotFoundException When a placeholder does not exist as a container parameter
     * @throws RuntimeException           When a container value is not a string or a numeric value
     */
    
private function resolve($value)
    {
        if (
is_array($value)) {
            foreach (
$value as $key => $val) {
                
$value[$key] = $this->resolve($val);
            }

            return 
$value;
        }

        if (!
is_string($value)) {
            return 
$value;
        }

        
$container $this->container;

        
$escapedValue preg_replace_callback('/%%|%([^%s]++)%/', function ($match) use ($container$value) {
            
// skip %%
            
if (!isset($match[1])) {
                return 
'%%';
            }

            
$resolved $container->getParameter($match[1]);

            if (
is_string($resolved) || is_numeric($resolved)) {
                return (string) 
$resolved;
            }

            throw new 
RuntimeException(sprintf(
                
'The container parameter "%s", used in the route configuration value "%s", '.
                
'must be a string or numeric, but it is of type %s.',
                
$match[1],
                
$value,
                
gettype($resolved)
                )
            );

        }, 
$value);

        return 
str_replace('%%''%'$escapedValue);
    }
}
Онлайн: 1
Реклама