Динамический префикс маршрута в Symfony2

Я создаю SaaS с symfony2, предоставляя частные сайты. То, что я пытаюсь сделать, это позволить людям получить доступ к веб-сайту таким образом:

http://www.mydomain.com/w/ {имя_сайта}

Вот конфигурация маршрутизации, которую я использую:

websites:
 resource: "@MyBundle/Resources/config/routing.yml"
 prefix: /w/{website_name}

Проблема в том, что когда я пытаюсь получить доступ, например, http://www.mydomain.com/w/chucknorris, я получаю сообщение об ошибке:

Во время рендеринга шаблона было исключено исключение ("Некоторые обязательные параметры отсутствуют (" имя_сайта ") для создания URL-адреса маршрута" websites_homepage ".) В" MyBundle: публикация: publicationsList.html.twig ".

Я понял, что моя конфигурация маршрута работает хорошо, но когда я вызываю маршрутизатор для генерации URL-адреса на веб-сайте, он не знает параметра URL-адреса {website_name}.

Одно из решений, которое я представил, - это найти способ автоматически и без видимости ввести этот параметр, когда он задан в контексте.

До сих пор все, что я мог сделать, это создать сервис, чтобы получить этот параметр следующим образом:

public function __construct(Registry $doctrine, ContainerInterface $container) {

 $website_name = $container->get('request')->get("website_name");

 if (!empty($website_name)) {

 $repository = $doctrine->getManager()->getRepository('MyBundle:website');

 $website = $repository->findOneByDomain($website_name);
 if ($website) {
 $this->website = $website;
 } else {
 throw new \Symfony\Component\HttpKernel\Exception\NotFoundHttpException();
 }
 } else {
 $this->isPortal = true;
 }
}

Мой вопрос: как я могу вставить этот аргумент во все созданные url, чтобы избежать ошибки в параметре, и без необходимости указывать его вручную каждый раз, когда я вызываю маршрутизатор в контроллерах или веточках? (Я предполагаю, что это что-то о событии запроса, но я не знаю, как это сделать и особенно, как это сделать в соответствии с хорошими обычаями symfony2)

UPDATE Вот слушатель, я создал базу на locallistener, предоставленный symfony:

<!--?php 
class WebsiteNameRouteEventListener implements EventSubscriberInterface { 
 private $router; 
 public function __construct(RequestContextAwareInterface $router = null) {
 $this--->router = $router;
 }
 public function onKernelResponse(FilterResponseEvent $event) { 
 $request = $event->getRequest();
 $this->setWebsiteName($request);
 } 
 public function onKernelRequest(GetResponseEvent $event) {
 $request = $event->getRequest(); 
 $this->setWebsiteName($request); 
 } 
 public static function getSubscribedEvents() {
 return array(
 // must be registered after the Router to have access to the _locale
 KernelEvents::REQUEST => array(array('onKernelRequest', 16)),
 KernelEvents::RESPONSE => 'onKernelResponse',
 );
 } 
 private function setWebsiteName(Request $request) { 
 if (null !== $this->router) {
 echo "NEW CODE IN ACTION";die();
 $this->router->getContext()->setParameter('website_name', $request->attributes->get("website_name"));
 }
 } 
 }

Но я все еще получаю эту ошибку:

Исключение было сделано во время рендеринга шаблона ("Некоторые обязательные параметры отсутствуют (" имя_сайта ") для создания URL-адреса для маршрута" домашняя страница ".) В" MyBundle: Publication: publicationsList.html.twig ". 500 Внутренняя ошибка сервера - Twig_Error_Runtime 1 связанное Исключение:

MissingMandatoryParametersException »

Без моего эха "...."; die() выполняется, поэтому я думаю, что ветка не запускает событие, которое я слушаю, когда он выполняет код пути (маршрутного имени).

Есть идеи?

1 ответ

Вы можете использовать контекст маршрутизатора.

$this->router->getContext()->setParameter('website_name', $website_name);

Посмотрите этот файл: https://github.com/symfony/symfony/blob/master/src/Symfony/Component/HttpKernel/EventListener/LocaleListener.php

licensed under cc by-sa 3.0 with attribution.