【问题标题】:Symfony 4.3 Route Collision in APISymfony 4.3 API 中的路由冲突
【发布时间】:2020-01-27 11:42:26
【问题描述】:
* @Route("/vehicle/{id}", methods={"GET"})

* @Route("/vehicle/categories/", methods={"GET"})

当我尝试在不传递任何参数的情况下访问我的 API vehicleCategories 时,symfony 采用第一个车辆 API 并将“类别”解释为参数。我怎样才能避免这种行为? 两个 API 在同一个控制器中。

【问题讨论】:

  • 路由是按顺序加载的,所以将第二种方法的代码移到第一种方法之前(在控制器内部),并在尝试前清除缓存。
  • 是的,已经知道了,但这真的是“正确”的解决方案吗?恐怕有人会在某个时候重新排列代码,这会破坏一切......
  • 如果你的代码可以被不知道 Symfony 工作原理的人修改,我认为这不会是你未来可能遇到的唯一问题;) PS:无论如何,如果你引入函数式测试可以降低发生这种情况的风险
  • 您不能在“id”中添加任何类型的要求吗?例如。它应该始终是一个整数。如果您的路线重叠,您需要创建更好的定义。
  • 我会为另一条路线使用不同的名称,因为它与带有参数的路线太接近了。

标签: api symfony symfony4


【解决方案1】:

如果你的“id”总是一个整数,你可以在你的路由中添加一个要求以避免冲突

 @Route("/vehicle/{id<\d+>}", methods={"GET"})

编辑:

或者如 cmets 中所说,使用不同且更全面的语法

@Route("/vehicle/{id}", methods={"GET"}, requirements={"id": "\d+"})

【讨论】:

  • 请注意,如果您愿意,也可以使用 @Route("/vehicle/{id}", methods={"GET"}, requirements={"id": "\d+"})语法
  • 这是真的@MaximeEychenne,而且更全面,我会编辑我的答案,谢谢!
猜你喜欢
  • 2021-08-24
  • 1970-01-01
  • 2020-07-23
  • 2015-11-14
  • 1970-01-01
  • 2014-05-28
  • 1970-01-01
  • 2021-10-18
  • 1970-01-01
相关资源
最近更新 更多