从Symfony 4.4 HttpFoundation\Request中删除参数并重新生成URL



我需要重新生成页面的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;

我不太喜欢它,但它完成了任务。

最新更新