0

我有一个生成如下 URL 的博客:

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

然后是一个论坛,其中包含使用以下 URL 的主题:

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

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

4

4 回答 4

2

路由器基于正则表达式,因此您不能直接这样做。但是一种可能对您有所帮助的解决方案是指定一条到某个操作的路线,该路线检查是否有文章“某些名称”以及是否存在重定向(或转发)到 ArticleController,如果不存在则重定向/转发到 ForumController。

于 2012-09-10T10:50:33.723 回答
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

于 2012-09-10T10:51:43.927 回答
1

您可以使用控制器的重定向功能。例如:

//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)));
    }
    // ...
}
于 2012-09-10T10:53:16.810 回答
1

有一个允许链式路由的捆绑包:

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

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

于 2012-09-10T20:08:13.140 回答