symfony2 добавить динамический параметр для маршрутизации, попробуйте с помощью пользовательского загрузчика

Я пытаюсь настроить пользовательский загрузчик маршрутизатора, как здесь

http://symfony.com/doc/current/cookbook/routing/custom_route_loader.html

я хочу добавить динамический параметр для всех маршрутов (параметр из сеанса)

это мой код

namespace Mea\Crm4Bundle\Routing; use Mea\Crm4Bundle\Entity\Application; use Symfony\Component\Config\FileLocatorInterface; use Symfony\Component\Config\Loader\Loader; use Symfony\Component\HttpFoundation\Session\Session; use Symfony\Component\Routing\Loader\AnnotationClassLoader; use Symfony\Component\Routing\Loader\AnnotationDirectoryLoader; use Symfony\Component\Routing\Loader\AnnotationFileLoader; use Symfony\Component\Routing\Loader\YamlFileLoader; use Symfony\Component\Routing\Route; use Symfony\Component\Routing\RouteCollection; use Symfony\Component\Yaml\Exception\ParseException; use Symfony\Component\Yaml\Parser as YamlParser; use Symfony\Component\Config\Resource\FileResource; class AppLoader extends YamlFileLoader { private static $availableKeys = array( 'resource', 'type', 'prefix', 'pattern', 'path', 'host', 'schemes', 'methods', 'defaults', 'requirements', 'options', 'condition', ); private $yamlParser; private $loaded = false; /** * @var */ private $annotationClassLoader; /** * @var */ private $session; /** * Constructor. * * @param FileLocatorInterface $locator A FileLocatorInterface instance * @param AnnotationClassLoader $annotationClassLoader * @param Session $session */ public function __construct(FileLocatorInterface $locator, AnnotationClassLoader $annotationClassLoader, Session $session) { $this->locator = $locator; $this->annotationClassLoader = $annotationClassLoader; $this->session = $session; } public function load($file, $type = null) { $appId = $this->session->get( Application::CRM_APP_ID_SESSION ); $path = $this->locator->locate($file); if (!stream_is_local($path)) { throw new \InvalidArgumentException(sprintf('This is not a local file "%s".', $path)); } if (!file_exists($path)) { throw new \InvalidArgumentException(sprintf('File "%s" not found.', $path)); } if (null === $this->yamlParser) { $this->yamlParser = new YamlParser(); } try { $parsedConfig = $this->yamlParser->parse(file_get_contents($path)); } catch (ParseException $e) { throw new \InvalidArgumentException(sprintf('The file "%s" does not contain valid YAML.', $path), 0, $e); } $collection = new RouteCollection(); $collection->addResource(new FileResource($path)); // empty file if (null === $parsedConfig) { return $collection; } // not an array if (!is_array($parsedConfig)) { throw new \InvalidArgumentException(sprintf('The file "%s" must contain a YAML array.', $path)); } foreach ($parsedConfig as $name => $config) { $config['defaults']['_applicationid']=$appId; if (isset($config['pattern'])) { if (isset($config['path'])) { throw new \InvalidArgumentException(sprintf('The file "%s" cannot define both a "path" and a "pattern" attribute. Use only "path".', $path)); } @trigger_error(sprintf('The "pattern" option in file "%s" is deprecated since version 2.2 and will be removed in 3.0. Use the "path" option in the route definition instead.', $path), E_USER_DEPRECATED); $config['path'] = $config['pattern']; unset($config['pattern']); } $this->validate($config, $name, $path); if (isset($config['resource'])) { $this->parseImport($collection, $config, $path, $file); } else { $this->parseRoute($collection, $name, $config, $path); } } return $collection; } public function supports($resource, $type = null) { return 'crmapp' === $type; } } 

здесь routing.yml

 mea_crm: resource: @MeaCrm4Bundle/Resources/config/routing.yml type: crmapp prefix: /{_applicationid} defaults: { _applicationid: 5 } 

здесь services.yml

  app.routing_loader: class: Mea\Crm4Bundle\Routing\AppLoader arguments: [@file_locator, @sensio_framework_extra.routing.loader.annot_class,@session] tags: - { name: routing.loader } 

Этот загрузчик запускается один раз, если я удаляю кеш. Поэтому я думаю, что это не то, что мне нужно. Как я могу переопределить маршрутизатор или другим способом – я хочу установить значение id_aplication id по умолчанию из сеанса.

ОБНОВЛЕНИЕ 1

i настроить маршрутизатор

здесь работает метод

 class RouteGenerator extends UrlGenerator public function doGenerate($variables, $defaults, $requirements, $tokens, $parameters, $name, $referenceType, $hostTokens, array $requiredSchemes = array()){ if(!isset($parameters[MeaCrm4Bundle::CRM_APP_SWITCH_PARAMETER])){ //for test $parameters[MeaCrm4Bundle::CRM_APP_SWITCH_PARAMETER] = 1212; } $url = parent::doGenerate($variables, $defaults, $requirements, $tokens, $parameters, $name, $referenceType, $hostTokens, $requiredSchemes); return $url; } 

когда я добавляю к параметрам.yml

 router.options.generator_base_class: Mea\Crm4Bundle\Routing\RouteGenerator 

у меня есть то, что я хочу – twig, controlerrs используют этот маршрутизатор и настраивают мой параметр. Только один – это не сервис, поэтому у меня нет @session. Какой лучший способ получить сессию здесь?

Ты создаешь другой класс – как услугу? Я получаю пример, чтобы переопределить генератор ветви, но существует способ переопределить основной маршрутизатор службой не класса?

ОБНОВЛЕНИЕ 2

поэтому я переопределяю маршрутизатор – но у меня нет сеанса – мне нужно как здесь

 public function __construct(RouteCollection $routes, RequestContext $context, LoggerInterface $logger = null, Session $session) { $this->routes = $routes; $this->context = $context; $this->logger = $logger; $this->session = $session; } 

но что теперь – как получить сеанс здесь?