1
votes

I am creating a SaaS with symfony2 providing private websites. What I am trying to do is to let people access the website this way :

http://www.mydomain.com/w/{website_name}

Here is the routing configuration i am using :

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

The problem is that when I try to access, for exemple, http://www.mydomain.com/w/chucknorris I am getting the error :

An exception has been thrown during the rendering of a template ("Some mandatory parameters are missing ("website_name") to generate a URL for route "websites_homepage".") in "MyBundle:Publication:publicationsList.html.twig".

What I understood is that my route configuration is working well but when I am calling the router to generates url in the website it isn't aware of the "context" {website_name} url parameter.

One solution I've imagined is to find a way to automatically and seemlessly inject this parameter when it's set in the context.

Until now all I've been able to do is to create a service to get this parameter this way :

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;
        }
}

My question is : How do I inject that argument to all url generated to avoid getting the error of parameter missing and without having to specify it manualy everytime I call the router in controllers or twig ? (I guess it's something about request event but i have no clue on how to do it and especialy how to do it according to symfony2 good usages)

UPDATE Here is the listener i created base on locallistener provided by 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"));
            }
        }    
    }

But i am still getting this error :

An exception has been thrown during the rendering of a template ("Some mandatory parameters are missing ("website_name") to generate a URL for route "homepage".") in "MyBundle:Publication:publicationsList.html.twig". 500 Internal Server Error - Twig_Error_Runtime 1 linked Exception:

MissingMandatoryParametersException ยป

Without my echo "...."; die() being executed so i guess twig is not firing the event i am listening on when it execute the path(routename) code.

Any idea ?

1

1 Answers

2
votes

You could use the router context.

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

See this file: https://github.com/symfony/symfony/blob/master/src/Symfony/Component/HttpKernel/EventListener/LocaleListener.php