尽管有否定断言,但用否定环视定义的路由与路由匹配

route defined with negative lookaround matches the route despite the negative assertion

我们想打开一个 DELETE 端点,允许调用所有正整数,但不能调用 id 1(也就是不能删除元素 1)

通常打开一个允许正整数的端点我这样配置路由

delete_elements:
 path: /elements/{id}
 methods: ["DELETE"]
 controller: app.elements_delete
 requirements:
  id: '\d+'

对于这种情况,我尝试将正则表达式更改为不允许数字 1 的正则表达式

delete_elements:
 path: /elements/{id}
 methods: ["DELETE"]
 controller: app.elements_delete
 requirements:
  id: /^(?!(?:1)$)\d+/

但是当我修改需求并调用端点时,响应是端点不存在。

"No route found for "DELETE /elements/59": Method Not Allowed (Allow: GET, PUT)"

那个正则表达式有什么问题?禁止某些值的正确方法是什么?

试试:

    id: '^(?!1/?$)\d+'

问题是路由被重定向到 Symfony 中以 / 结尾的 URL。所以你原来的否定前瞻不起作用,因为它正在寻找 1 后跟“字符串结尾”($)。

通过将 /? 添加到正则表达式,您表示负前瞻可以是 1$1/$

虽然这可行,但我的建议是在应用程序级别处理此问题,并且 return 当有人试图删除他们不允许删除的内容时出现 403,而不是 return 404 这意味着不同的东西。