如何在不指定自定义控制器的情况下从 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-tripcontact,具体取决于访问者是在访问行程的页面还是从联系页面提交表单.例如 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

所以,问题

只需在您的另一条路线上添加要求,使 destinationSeoUri 不能等于 submit。这应该强制该路由不匹配,并抛出 404 而不是 405 错误。

trip:
    path: /{destinationSeoUri}/{tripSeoUri}
    methods: [ GET ]
    defaults: { _controller: AppBundle:Trip:trip }
    requirements:
        destinationSeoUri: "^(?!submit$)"