我在PostController中有一个动作,它显示主页上的所有帖子都有一个slug作为参数。
PostController中:displayAction
/**
* @Route("/{postSlug}", defaults={"postSlug"= false})
* @Template()
*/
public function displayAction($postSlug)
{
//Forget about whats inside here
return array[];
}
现在我有另一个控制器用于具有登录操作的用户,并且我在路由注释中设置/登录为路由
UserController中:则loginAction
/**
* @Route("/login")
* @Template()
*/
public function loginAction()
{
//bla bla bla
return [];
}
现在的问题是,当我尝试访问localhost:8000 / login时,它会显示一个白页,调试工具栏上的控制器和操作是PostController:DisplayAction,它应该是UserController :: loginAction。我相信它的原因是它引起了一些与slug的冲突,但我可以通过说我有另一个控制器“CreatePostController”具有Route注释“/ create”来保护我的立场,它工作正常,我不知道为什么但它的工作原理
我确信我犯了一些错误,但不知道是什么,如果存在冲突,那么CreatePostController如何工作?
路由器:调试屏幕截图
的routing.yml
blogger_blog_homepage:
resource: "@BloggerBlogBundle/Controller"
type: annotation
答案 0 :(得分:2)
问题在于路由。如果您在/ login route之前有/ {postSlug}的路由声明,那么它将在/ login之前访问/ {postSlug},因为login也匹配postSlug。系统不知道登录不是postSlug。
您可以在/ {postSlug}路由之前放置/登录路由来避免这种情况。检查您的routing.yml文件。
因为您使用注释进行路由,所以必须小心,因为Symfony使用了一些优先级。
将您的routing.yml分解为:
blogger_blog_user:
resource: "@BloggerBlogBundle/Controller/UserController.php"
type: annotation
blogger_blog_homepage:
resource: "@BloggerBlogBundle/Controller/PostController.php"
type: annotation
CreatePostController也一样。 UserController必须在其他控制器之前。
答案 1 :(得分:1)
您可以添加requirmens参数,例如,如果postSlug只有数字:
/**
* @Route("/{postSlug}", defaults={"postSlug"= false}, requirements={"postSlug"="\d+"})
* @Template()
*/
public function displayAction($postSlug)
{
//Forget about whats inside here
return array[];
}