Php Symfony2上2个控制器之间的路由问题
目前,我已经建立了一个网站,以以下链接为例(这些是开发链接):-Php Symfony2上2个控制器之间的路由问题,php,symfony,Php,Symfony,目前,我已经建立了一个网站,以以下链接为例(这些是开发链接):- 以下routing.yml设置的这两项工作:- singlepost: path: /help-advice/{category}/{post} defaults: { _controller: FrontBundle:Posts:singlepost } livepages: pattern: /{slug} defaults: { _controller: F
singlepost:
path: /help-advice/{category}/{post}
defaults: { _controller: FrontBundle:Posts:singlepost }
livepages:
pattern: /{slug}
defaults: { _controller: FrontBundle:Pages:livepages }
requirements:
slug: .+
理想情况下,我希望将“帮助和建议”链接更改为以下内容:-
singlepost:
path: /{category}/{post}
defaults: { _controller: FrontBundle:Posts:singlepost }
livepages:
pattern: /{slug}
defaults: { _controller: FrontBundle:Pages:livepages }
requirements:
slug: .+
由于livepages控制器中允许“/”,这导致列出的两个控制器之间出现问题。如果我访问“会见团队”页面,它会尝试返回singlepost控制器而不是livepages控制器
有人能帮忙吗?试着交换这条路线
livepages:
pattern: /{slug}
defaults: { _controller: FrontBundle:Pages:livepages }
requirements:
slug: .+
singlepost:
path: /{category}/{post}
defaults: { _controller: FrontBundle:Posts:singlepost }
已更新
如果允许使用/in slug,则此操作不起作用
然后,我认为您可以使用比livepages更高的优先级为每个类别动态注册路由(或者为现有类别动态设置允许值(需求)列表)
或者相反的解决方案:动态配置livepages路由并设置比singlepost更高的优先级定义两个具有相同要求且匹配相同模式的路由是没有意义的。 您需要对它们进行区分(即条件、要求) 如果确实需要将其保持为实际状态,则可以在控制器中进行一些检查以进行(或不进行)重定向 例如:
public function livepagesAction($slug)
{
$em = $this->getDoctrine()->getManager();
$existingPage = $em->getRepository('Bundle:Page')->findBySlug($slug);
if (!$existingPage) {
$parsedUri = explode('/', $slug);
// If no '/' or less than two route parameters, return a 404
if (!strpos($slug, '/') || count($parsedUri) < 2) {
throw $this->createNotFoundException('Route not found');
}
// Redirect to the singlepost route
return $this->redirectToRoute('singlepost', array(
'category' => $parsedUri[0],
'post' => $parsedUri[1],
));
}
// Render the view that corresponds to the existing slug.
}
公共函数livepagesAction($slug)
{
$em=$this->getDoctrine()->getManager();
$existingPage=$em->getRepository('Bundle:Page')->findBySlug($slug);
如果(!$existingPage){
$parsedUri=爆炸('/',$slug);
//如果没有“/”或少于两个路由参数,则返回404
如果(!strpos($slug,“/”)| |计数($parsedUri)<2){
抛出$this->createNotFoundException('Route not found');
}
//重定向到singlepost路由
返回$this->redirectToRoute('singlepost',数组(
“类别”=>$parsedUri[0],
'post'=>$parsedUri[1],
));
}
//渲染与现有段塞对应的视图。
}
除了singlepost
路由中的一些要求(例如参数的特定类型),您还可以根据需要对其进行调整
如果这涉及到两条以上的路线,您可以通过创建一个为您这样做的控制器来减轻控制器的负担。嗨,阿图尔,谢谢您的回答。不幸的是,这不起作用,因为帮助和建议帖子是在livepages控制器而不是singlepost上运行的。这是因为livepages允许在Slug中使用“/”。