如何在不指定自定义控制器的情况下从 YML 中的 symfony 路由强制 404?
How do I force a 404 from the symfony routing in YML without specifying a custom controller?
要解决的问题
我想在 symfony 中强制触发某个特定路由的 404
,而不必指定一个只抛出异常的自定义控制器,并且在路由器继续探索路由的其余部分之前文件。
我可以在特定路线的 routing.yml
文件中说吗?
上下文
我在我的旅行社中有这样的表格提交路线:
POST /submit/{submitterForm}
其中 submitterForm
只能采用 2 个值:purchase-trip
和 contact
,具体取决于访问者是在访问行程的页面还是从联系页面提交表单.例如 POST /submit/contact
是有效的。
我有另一条路线:
GET /{destinationSeoUri}/{tripSeoUri}
显示目的地的特定行程。例如 GET /thailand/trip-bangkok-beaches
是有效的。
来自路由器的限制值
这是我的routing.yml
:
的相关摘录
submit:
path: /submit/{submitterForm}
methods: [ POST ]
defaults: { _controller: AppBundle:DataSubmission:submit }
requirements:
submitterForm: purchase-trip|contact
trip:
path: /{destinationSeoUri}/{tripSeoUri}
methods: [ GET ]
defaults: { _controller: AppBundle:Trip:trip }
我想要的
对于在路由 {submitterForm}
中具有无效值 {submitterForm}
的任何 POST
请求,我希望系统 returns a 404 Not Found
现在不会发生,因为当路由器不匹配 submit
路由模式时,它仍然下降到下一个然后匹配 trip
模式。
然后,系统说"okey, I have a route that matches, instead, this is only allowed for GET, so I'll respond a 405 Method not allowed
"。
这适用于 POST /thailand/trip-bangkok-beaches
之类的内容,但我想特别向客户发出信号,如果 POST
与 /submit/any-invalid-form-submitter-name
匹配,则它是未找到的。
初步解决方案
为此,我按顺序在前两个中间插入了一个 /submit/*
的包罗万象的内容,就像在这个路由摘录中一样:
submit:
path: /submit/{submitterForm}
methods: [ POST ]
defaults: { _controller: AppBundle:DataSubmission:submit }
requirements:
submitterForm: purchase-trip|contact
submit_fallback:
path: /submit/{submitterForm}
methods: [ POST ]
defaults: { _controller: AppBundle:DataSubmission:notFound }
trip:
path: /{destinationSeoUri}/{tripSeoUri}
methods: [ GET ]
defaults: { _controller: AppBundle:Trip:trip }
这样,向 POST /submit/any-invalid-form-submitter-name
的请求与 submit_fallback
路由匹配。
控制器
控制器非常简单"on-liner":
{
throw new NotFoundHttpException();
}
首选解决方案
我想我正在寻找与此类似的东西:
submit_fallback:
path: /submit/{submitterForm}
methods: [ POST ]
status: 404
所以,问题
- 我可以告诉
submit_fallback
这样的话吗:嘿伙计,你不需要 _controller
只是因为你必须发送404 Not found
(或我想要的任何其他状态),仅此而已。
- 如果是,怎么做?
只需在您的另一条路线上添加要求,使 destinationSeoUri
不能等于 submit
。这应该强制该路由不匹配,并抛出 404 而不是 405 错误。
trip:
path: /{destinationSeoUri}/{tripSeoUri}
methods: [ GET ]
defaults: { _controller: AppBundle:Trip:trip }
requirements:
destinationSeoUri: "^(?!submit$)"
要解决的问题
我想在 symfony 中强制触发某个特定路由的 404
,而不必指定一个只抛出异常的自定义控制器,并且在路由器继续探索路由的其余部分之前文件。
我可以在特定路线的 routing.yml
文件中说吗?
上下文
我在我的旅行社中有这样的表格提交路线:
POST /submit/{submitterForm}
其中 submitterForm
只能采用 2 个值:purchase-trip
和 contact
,具体取决于访问者是在访问行程的页面还是从联系页面提交表单.例如 POST /submit/contact
是有效的。
我有另一条路线:
GET /{destinationSeoUri}/{tripSeoUri}
显示目的地的特定行程。例如 GET /thailand/trip-bangkok-beaches
是有效的。
来自路由器的限制值
这是我的routing.yml
:
submit:
path: /submit/{submitterForm}
methods: [ POST ]
defaults: { _controller: AppBundle:DataSubmission:submit }
requirements:
submitterForm: purchase-trip|contact
trip:
path: /{destinationSeoUri}/{tripSeoUri}
methods: [ GET ]
defaults: { _controller: AppBundle:Trip:trip }
我想要的
对于在路由 {submitterForm}
中具有无效值 {submitterForm}
的任何 POST
请求,我希望系统 returns a 404 Not Found
现在不会发生,因为当路由器不匹配 submit
路由模式时,它仍然下降到下一个然后匹配 trip
模式。
然后,系统说"okey, I have a route that matches, instead, this is only allowed for GET, so I'll respond a 405 Method not allowed
"。
这适用于 POST /thailand/trip-bangkok-beaches
之类的内容,但我想特别向客户发出信号,如果 POST
与 /submit/any-invalid-form-submitter-name
匹配,则它是未找到的。
初步解决方案
为此,我按顺序在前两个中间插入了一个 /submit/*
的包罗万象的内容,就像在这个路由摘录中一样:
submit:
path: /submit/{submitterForm}
methods: [ POST ]
defaults: { _controller: AppBundle:DataSubmission:submit }
requirements:
submitterForm: purchase-trip|contact
submit_fallback:
path: /submit/{submitterForm}
methods: [ POST ]
defaults: { _controller: AppBundle:DataSubmission:notFound }
trip:
path: /{destinationSeoUri}/{tripSeoUri}
methods: [ GET ]
defaults: { _controller: AppBundle:Trip:trip }
这样,向 POST /submit/any-invalid-form-submitter-name
的请求与 submit_fallback
路由匹配。
控制器
控制器非常简单"on-liner":
{
throw new NotFoundHttpException();
}
首选解决方案
我想我正在寻找与此类似的东西:
submit_fallback:
path: /submit/{submitterForm}
methods: [ POST ]
status: 404
所以,问题
- 我可以告诉
submit_fallback
这样的话吗:嘿伙计,你不需要_controller
只是因为你必须发送404 Not found
(或我想要的任何其他状态),仅此而已。 - 如果是,怎么做?
只需在您的另一条路线上添加要求,使 destinationSeoUri
不能等于 submit
。这应该强制该路由不匹配,并抛出 404 而不是 405 错误。
trip:
path: /{destinationSeoUri}/{tripSeoUri}
methods: [ GET ]
defaults: { _controller: AppBundle:Trip:trip }
requirements:
destinationSeoUri: "^(?!submit$)"