如何在Symfony2中为2个独立的控制器设置2个具有相同模式的动态路由?

时间:2012-09-10 10:41:11

标签: php symfony

我有一个博客可以生成以下网址:

/article-name
/my-article
/other-article

然后有一个使用以下网址的论坛:

/thread-name
/my-thread
/what-do-you-think

如何让路由器处理这种情况?我不想再使用任何URL参数(如/blog/article-name and /forum/thread-name)。最好的方法是首先询问博客控制器是否有一篇包含此URL的文章,如果没有,请询​​问论坛控制器。但是如何?

4 个答案:

答案 0 :(得分:2)

路由器基于正则表达式,所以你不能直接这样做。但是一个可能对你有帮助的解决方案是指定一个路由到某个动作,它检查是否有文章“some-name”,如果它存在重定向(或转发)到ArticleController,如果不存在,它重定向/转发到ForumController。

答案 1 :(得分:2)

您必须定义事件监听器。

services:
    kernel.listener.subdomain_listener:
        class: Path\To\YourListener\RequestListener
        scope: request
        tags:
           - { name: kernel.event_listener, event: kernel.request, method: onKernelRequest }

然后,在您的RequestListener中,您应该定义onKernelRequest()方法并将路线处理放在那里,例如

public function onKernelRequest(GetResponseEvent $event)
{
    if ($event->getRequestType() !== \Symfony\Component\HttpKernel\HttpKernel::MASTER_REQUEST) {
        return;
    }

    //... check if article exists, otherwise forward to blog controller
}

有关事件监听器的其他信息,请参阅文档:

http://symfony.com/doc/current/cookbook/service_container/event_listener.html
http://symfony.com/doc/2.0/cookbook/doctrine/event_listeners_subscribers.html

答案 2 :(得分:1)

您可以使用控制器“redirecting functionality。例如:

//BlogController.php

public function indexAction ($articleName) {
    // ...
    // If article $articleName exists
    if ($article = $repo->findOneByName($articleName) {
        // ...
    // else let the forum controller handle request
    } else {
        return $this->redirect($this->generateUrl('forum_index', array('articleName' => $articleName)));
    }
    // ...
}

答案 3 :(得分:1)

有一个允许链接路由的包:

http://symfony-cmf.readthedocs.org/en/latest/reference/routing-extra.html

有人在symfony2邮件对话中向我推荐。