【问题标题】:Symfony add a parameter to route, this parameter is a encoded URISymfony给路由添加一个参数,这个参数是一个编码的URI
【发布时间】:2016-06-17 23:47:29
【问题描述】:

我有一个这样定义的路由(控制器有一个前缀/email):

/**
 * Opens send dialog
 *
 * @Route("/compose/{redirect_to}", name="email_compose", defaults={"redirect_to" = "/"})
 * @Method({"GET", "POST"})
 * @Template("EmailBundle:Email:compose.html.twig")
 */

我尝试通过 javascript ajax POST 调用此路由,但即使使用 GET 请求,我也会遇到路由错误:

http://example.com/app_dev.php/email/compose/%2Fapp_dev.php%2Fcurrent%2Fdetail%2F7

这会引发 404 错误:

在此服务器上找不到请求的 URL /app_dev.php/email/compose//app_dev.php/current/detail/7

如果我尝试像这样更简单的调用,它可以正常工作:

http://example.com/app_dev.php/email/compose/aaa

如何在查询字符串中传递一个 URI 参数?

谢谢

【问题讨论】:

    标签: symfony routing


    【解决方案1】:

    您可以通过允许在相应路线中使用斜杠,例如:

    compose:
        pattern: /compose/{redirectTo}
        # [defaults]
        requirements:
            redirectTo: ".+"
    

    对应的文档here

    但是,因为您没有尝试使用 Ajax 路由(在这种情况下,自定义路由是强制性的),所以没有理由将您的目标 url 作为路由参数传递。

    (将其作为查询传递将是/compose?redirecTo=[redirectTo]

    另外,正如@johnSmith 所说(太快了!),您应该在您的路线中使用POST 请求,就像这样:

    other:
        pattern: /compose
        # [defaults]
        requirements:
            methods: POST
    

    然后,像他说的那样检索参数,并创建你的重定向。

    【讨论】:

    • 问题是,我更喜欢 querystring 中的这个参数,因为路由可以通过 GET 或 POST 调用,所以在 GET 调用中组合路由会更容易。我仍然得到一个 404 这个@Route("/compose/{redirect_to}", name="email_compose", defaults={"redirect_to" = ""}, requirements={"redirect_to"=".+"})
    • 顺便说一句,我正在做一个 Ajax 调用
    • 我认为你的路由中的双 // 可能是问题的原因(使路由在主机名之后重新启动)。尝试删除redirectTo 中的第一个/,这应该符合您添加的要求。
    • 我不确定我说的是什么,因为路线完全被解释为错误说。我对@Route 注释不熟悉,请确保要求正确,也许可以查看文档。
    【解决方案2】:

    你应该使用 POST 作为方法并将重定向路由添加到表单数据

    这样说

    $.ajax({
        url: '/path/to/file',
        type: 'POST',
        data: {redirectTo: '/current/detail/7'},
    })
    

    并在控制器中解析这些数据,如

    $redirectTo=$this->getRequest()->get('redirectTo');
    

    所以你不会有任何麻烦

    如果您对redirectTo 进行urlEncode 并附加为GET 参数,您也不会遇到任何问题,例如在? 之后您可以使用与上面相同的代码检索它,但是将url 作为路由片段也不会产生很有意义,但也可以通过允许 / 成为参数中的有效字符

    http://symfony.com/doc/current/cookbook/routing/slash_in_parameter.html

    【讨论】:

    • 我同时应用了 POST 和使用 ?在查询字符串而不是路由参数中
    猜你喜欢
    • 1970-01-01
    • 2023-04-08
    • 2016-11-08
    • 1970-01-01
    • 2017-05-29
    • 2016-06-16
    • 2020-04-20
    • 1970-01-01
    • 2018-02-04
    相关资源
    最近更新 更多