* * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Symfony\Bundle\FrameworkBundle\Routing; use Symfony\Component\Routing\Router as BaseRouter; use Symfony\Component\Routing\RequestContext; use Symfony\Component\DependencyInjection\ContainerInterface; use Symfony\Component\Routing\RouteCollection; /** * This Router only creates the Loader only when the cache is empty. * * @author Fabien Potencier */ class Router extends BaseRouter { 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 * @param array $defaults The default values */ public function __construct(ContainerInterface $container, $resource, array $options = array(), RequestContext $context = null, array $defaults = array()) { $this->container = $container; $this->resource = $resource; $this->context = null === $context ? new RequestContext() : $context; $this->defaults = $defaults; $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->applyParameters($this->collection); } return $this->collection; } /** * Replaces placeholders with service container parameter values in route defaults. * * @param $collection * * @return void */ private function applyParameters(RouteCollection $collection) { foreach ($collection as $route) { if ($route instanceof RouteCollection) { $this->applyParameters($route); } else { foreach ($route->getDefaults() as $name => $value) { if (preg_match('#^%(.+)%$#', $value, $matches) && $this->container->hasParameter($matches[1])) { $route->setDefault($name, $this->container->getParameter($matches[1])); } } } } } }