代码之家  ›  专栏  ›  技术社区  ›  user3440145

Symfony 3-路由要求-定义路由要求时映射到参数1的所有URL部分

  •  1
  • user3440145  · 技术社区  · 8 年前

    我正在使用Symfony 3.3.10进行一个项目。

    我用这样的3个参数定义了一条路线

    /**
     * @Route("/{_locale}/{cat_1}/{cat_2}/{cat_3}", name="cat_site",
     *     defaults={"cat_1" = "", "cat_2" = "", "cat_3" = ""})
     */
    public function catSiteAction(Request $request, $cat_1, $cat_2, $cat_3)
    { ... }
    

    调用URL

    [root_path]/en/x/y/z
    

    导致(如预期)将方法参数设置为

    cat_1 = 'x'
    cat_2 = 'y'
    cat_3 = 'z'
    

    这正是我想要的。

    现在,我配置了FOSUserBundle,为了使捆绑包路由正常工作,我在路由定义中添加了一个要求,即如果cat_1设置为“登录”或“注销”,则不会触发路由:

    /**
     * @Route("/{_locale}/{cat_1}/{cat_2}/{cat_3}", name="standard_site",
     *     defaults={"cat_1" = "", "cat_2" = "", "cat_3" = ""},
     *     requirements={"cat_1": "^(?!login|logout).+"})
     */
    public function catSiteAction(Request $request, $cat_1, $cat_2, $cat_3)
    { ... }
    

    当调用与之前相同的url时

    [根路径]/en/x/y/z
    

    这将导致如下参数设置:

    cat_1 = 'x/y/z'
    cat_2 = ''
    cat_3 = ''
    

    显然,这不是我想要的参数,我根本不知道为什么会发生这种情况。我在需求定义或使用的正则表达式中看不到任何可能导致这种情况的东西。

    任何想法都将受到高度赞赏。

    1 回复  |  直到 8 年前
        1
  •  1
  •   user3440145    8 年前

    问题是您正在修改默认正则表达式: [^/]+ 对于 cat_1

    Symfony doc

    尝试以下不允许 / 出席(编辑):

    requirements={"cat_1": "^(?!login|logout)[^\/]+"})