Symfony2中的动态路由前缀

时间:2013-10-16 14:49:56

标签: php symfony url-routing

我正在使用提供私人网站的symfony2创建一个SaaS。 我想做的是让人们以这种方式访问​​网站:

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

以下是我使用的路由配置:

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

问题是当我尝试访问时,例如http://www.mydomain.com/w/chucknorris我收到错误:

  

在渲染模板期间抛出了异常(“Some   缺少必需参数(“website_name”)来生成URL   路线“sites_homepage”。“)in   “MyBundle:出版:publicationsList.html.twig”。

我的理解是我的路由配置运行良好但是当我调用路由器在网站中生成网址时,它不知道“context”{website_name} url参数。

我想象的一个解决方案是找到一种在上下文中设置时自动且无缝地注入此参数的方法。

到目前为止我所能做的就是创建一个服务来获取这个参数:

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良好的用法做到这一点)

更新 这是我基于symfony提供的locallistener创建的监听器:

    <?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"));
            }
        }    
    }

但我仍然收到此错误:

  

在渲染模板期间抛出了异常(“Some   缺少必需参数(“website_name”)来生成URL   路线“主页”。“)in   “MyBundle:出版:publicationsList.html.twig”。 500内部   服务器错误 - Twig_Error_Runtime 1链接异常:

MissingMandatoryParametersException »

没有我的回声“......”; die()被执行所以我猜twig没有触发我在执行路径(routename)代码时正在侦听的事件。

有什么想法吗?

1 个答案:

答案 0 :(得分:2)

您可以使用路由器上下文。

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

请参阅此文件:https://github.com/symfony/symfony/blob/master/src/Symfony/Component/HttpKernel/EventListener/LocaleListener.php