Php 为什么Symfony逃脱&;使用url_for()时的字符数?
通过这个Symfony页面,我在URI中传递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&%3Bsort=1 在我的布局中,页面中的某些链接需要具有相同的查询字符串 无论如何,使用Symfony的url\u for()命令,我创建的url如下: $url = url_for('article/index?.http_buil
$\u GET
参数,如下所示:
http://www.mysite.com/article?page=4&sort=1
http://www.mysite.com/article?page=4&%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&%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变量。基本上,考虑到您现在知道这是一个转义问题,解决它应该相当简单。