Php 为什么Symfony逃脱&;使用url_for()时的字符数?

Php 为什么Symfony逃脱&;使用url_for()时的字符数?,php,http,symfony1,uri,Php,Http,Symfony1,Uri,通过这个Symfony页面,我在URI中传递$\u GET参数,如下所示: http://www.mysite.com/article?page=4&sort=1 http://www.mysite.com/article?page=4&amp%3Bsort=1 在我的布局中,页面中的某些链接需要具有相同的查询字符串 无论如何,使用Symfony的url\u for()命令,我创建的url如下: $url = url_for('article/index?.http_buil

通过这个Symfony页面,我在URI中传递
$\u GET
参数,如下所示:

http://www.mysite.com/article?page=4&sort=1
http://www.mysite.com/article?page=4&amp%3Bsort=1
在我的布局中,页面中的某些链接需要具有相同的查询字符串

无论如何,使用Symfony的
url\u for()
命令,我创建的url如下:

$url = url_for('article/index?.http_build_query($_GET));
这样,它就可以使用$\u GET变量生成一个新的url。对于一些链接,我会提前更改$\u GET值,比如
$\u GET['sort']=0生成url之前。这就是我使用这种方法的原因

无论如何,当我查看生成的URL时,它现在看起来是这样的:

http://www.mysite.com/article?page=4&sort=1
http://www.mysite.com/article?page=4&amp%3Bsort=1
&%3B
&
它只是一个
&
字符

所以问题是,当我现在在控制器中检查我的$\u GET参数时,不再传递
sort
参数。它现在被称为
&%3Bsort
。。。它引起了各种各样的问题

两个问题:

  • 我如何避免这个问题?我可以解码控制器中的
    $\u获取
    参数键值吗

  • 为什么symfony首先编码的是
    &
    字符?这是一个完全可以接受的URI字符。见鬼,即使是编码的值,
    &%3B
    也包含一个
    &


  • 最好使用Symfony自己的方法获取请求参数。例如,在模板中,使用:

    $sf_request->getParameter('some_param');
    
    如果必须使用$\u GET,请尝试:

     (((    $sf_data->getRaw('_GET')   )))
    

    。。。要通过输出转义。我不完全确定它是否能正常工作。

    我相信,这是因为应用程序中的输出转义是打开的。因此,$\u GET数组被包装在SFOutputEscaperarArrayCorator类中。您可以使用以下命令获取原始值:
    $\u get->getRawValue()

    或者,您可以使用sfoutputescape::unescape对结果查询进行解码

    $url = url_for('article/index?.sfOutputEscaper::unescape(http_build_query($_GET)));
    

    希望这会有用。

    在我的控制器中,我使用$request->getParameter()。它返回
    &%3Bsort
    作为参数键。@Jakobud:所以,为了正确地执行此操作,您首先在操作中生成URL并将其传递到模板中,单击后,参数会被损坏。这是对的吗?对不起,我并不是想对否决票无礼。这不是答案。是的,我生成的url是这样的:
    url='article/index?sort=true&whatever=false'
    将其传递到
    url\u for($url)
    后,url显示为
    http://www.mysite.com/article?sort=true&%3Bwhatever=false
    。因此,现在当我的控制器尝试读取我的参数时,
    无论什么
    参数现在称为
    &%3Bwhatever
    参数。是的,即使我使用
    $request->getParameter()
    。好的,url帮助程序主要用于模板(有直接的操作方法,如generateUrl()等。但是,从操作传递到模板的所有内容都会被转义。或者将其作为“原始”获取在模板中输出,或者使用$sf_请求对象并解析该对象,或者尝试使用html_entity_decode()包装传递的$url变量。基本上,考虑到您现在知道这是一个转义问题,解决它应该相当简单。