我有一个博客可以生成以下网址:
/article-name
/my-article
/other-article
然后有一个使用以下网址的论坛:
/thread-name
/my-thread
/what-do-you-think
如何让路由器处理这种情况?我不想再使用任何URL参数(如/blog/article-name and /forum/thread-name
)。最好的方法是首先询问博客控制器是否有一篇包含此URL的文章,如果没有,请询问论坛控制器。但是如何?
答案 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邮件对话中向我推荐。