我需要重新生成页面的URL,删除额外的参数。例如:当我收到:
/bao1/bao2/?removeMe1=anything&keepMe1=anything&removeMe2=&keepMe2=anything
我想在删除removeMe
查询变量的情况下生成URL,但其他内容保持不变。像这样:
/bao1/bao2/?keepMe1=anything&keepMe2=anything
我自动发送了请求:
public function __construct(RequestStack $httpRequest)
{
$this->httpRequest = $httpRequest;
}
然后我就这样玩了:
public function getCleanUrl()
{
// HttpFoundationRequest
$currentHttpRequest = $this->httpRequest->getCurrentRequest();
// Trying to remove the parameters
$currentHttpRequest->query->remove("removeMe1");
return $currentHttpRequest->getUri()
}
query->remove("removeMe1")
可以工作,但当我调用getUri()
时,我仍然会得到完整的输入url,就好像从未调用过remove()
一样。我想我可能错过了打某种$currentHttpRequest->regenerate()->getUri()
的机会,但我什么都找不到。
要在Request
对象上调用mutator方法后获得修改后的URL,需要调用overrideGlobals()
。
如果没有,Request
方法将根据原始超全局($_GET
、$_POST
、$_SERVER
(给出结果。通过调用Request::overrideGlobals()
,您可以告诉对象不要。
例如:
if ($request->query->has('amp') && Request::METHOD_GET === $request->getMethod()) {
$request->query->remove('amp');
$request->overrideGlobals();
return new RedirectResponse($request->getUri(), Response::HTTP_MOVED_PERMANENTLY));
}
或者,一些更适合您的用例的东西(未经测试,但总体想法应该成立(:
$queryParams = array_keys($request->query->all());
$goodParams = ['foo', 'bar', 'baz'];
$badParams = array_diff($queryParams, $goodParams);
foreach ($badParams as $badParam) {
$request->query->remove($badParam);
}
$request->overrideGlobals();
// get modified URL
echo $request->getUri();
我必须让它发挥作用,所以我设计了一个非Symfony解决方案:
$currentHttpRequest = $this->httpRequest->getCurrentRequest();
$arrParams = $currentHttpRequest->query->all();
$arrParams = array_intersect_key($arrParams, array_flip([
"keepMe1", "keepMe2"
]));
$currentUrlNoQs = strtok($currentHttpRequest->getUri(), '?');
if( empty($arrParams) ) {
$canonical = $currentUrlNoQs;
} else {
$queryString = http_build_query($arrParams);
$canonical = $currentUrlNoQs . '?' . $queryString;
}
return $canonical;
我不太喜欢它,但它完成了任务。