Slugs导致路由冲突

时间:2014-11-10 05:07:26

标签: symfony slug

我在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如何工作?

路由器:调试屏幕截图 Router:Debug

的routing.yml

blogger_blog_homepage:
resource: "@BloggerBlogBundle/Controller"
type: annotation

2 个答案:

答案 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[];
 }