【问题标题】:Symfony 3 - route requirements - all URL-parts mapped to parameter 1 when defining a route requirementSymfony 3 - 路由要求 - 定义路由要求时映射到参数 1 的所有 URL 部分
【发布时间】:2025-12-15 07:05:03
【问题描述】:

我正在使用 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)
{ ... }

调用网址

[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时

[root_path]/en/x/y/z

这导致这样的参数设置:

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

显然这不是我想要的参数,我完全不知道为什么会这样。我在需求定义或使用的正则表达式中看不到任何可能导致此问题的内容。

高度赞赏任何想法。

【问题讨论】:

    标签: symfony routing symfony-3.3 symfony-routing symfony3.x


    【解决方案1】:

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

    Symfony doc

    尝试以下路线,不允许 / 出现(已编辑):

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

    【讨论】:

    • 谢谢。你对修改是正确的。不幸的是,建议的正则表达式不起作用。我还无法修复它。一个小问题是“/”没有被转义,但是当用“\/”转义它时,表达式也不起作用,因为 OR 部分它允许所有不包含“/”的单词通过。 .
    • 是的,你是对的。找到正确答案后,请随意编辑答案。