要解决的问题

我想强制在symfony中为某个特定路由触发404 ,而不必指定一个仅引发异常的自定义控制器,并且在路由器继续探索路由文件的其余部分之前。

我可以在routing.yml文件中为特定路由说吗?

语境

我在旅行社中有此送修表格的路线:

POST /submit/{submitterForm}

其中submitterForm只能采用两个值: 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 }

我想要的是

对于路由/submit/{submitterForm}值为{submitterForm}无效的任何POST请求,我希望系统返回404 Not Found

现在不会发生这种情况,因为当路由器与submit路由模式不匹配时,它仍然会落入下一个路由模式,然后与trip模式匹配。

然后,系统说“好的,我有一个匹配的路由,相反,这仅适用于GET,因此我将响应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路由匹配。

控制器

控制器是一个非常简单的“在线”:

{
    throw new NotFoundHttpException();
}

首选解决方案

我想我正在寻找类似的东西:

submit_fallback:
    path: /submit/{submitterForm}
    methods: [ POST ]
    status: 404

所以,问题

  • 我是否可以将submit_fallback告诉: submit_fallback嘿,您不需要_controller只是因为您必须发送404 Not found (或我想要的任何其他状态)而已。
  • 如果是这样,怎么办?

===============>>#1 票数:0

只需在您的其他路线上添加需求,即可使destinationSeoUri不能等同于submit 这将强制该路由不匹配,并抛出404错误而不是405错误。

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

  ask by Xavi Montero translate from so

未解决问题?本站智能推荐: