Symfony为路由添加参数,此参数是编码的URI

时间:2016-03-04 09:45:04

标签: symfony routing

我有一个像这样定义的路由(控制器有一个前缀/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错误:

  

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

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

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

如何在作为URI的查询字符串中传递参数?

谢谢

2 个答案:

答案 0 :(得分:2)

您应该使用POST作为方法并将重定向路由添加到formdata

谎言这个

$.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

答案 1 :(得分:2)

您可以在相应的路线中允许斜线,例如:

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

相应的文档here

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

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

另外,正如@johnSmith所说的那样(太快了!),你应该使用POST请求,在你的路线中要求它:

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

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