📅  最后修改于: 2023-12-03 14:51:33.517000             🧑  作者: Mango
当在表单提交后需要返回之前的页面时,需要获取之前的URL地址。在 Symfony 4 中,可以使用 PHP SuperGlobal 变量$_SERVER['HTTP_REFERER']
来获取前一个 URL,但是这种方法并不可靠,因为有些浏览器可能不会发送 referer 信息,另外 referer 也可以被人为地篡改。因此,Symfony 官方并不建议使用该方法。
建议的方法是在控制器中将当前 URL 保存到会话中,然后在表单提交后使用 save referer 的服务来获取之前的 URL。
为了让表单知道之前的 URL,需要在表单呈现时将当前的 URL 储存在会话中。
use Symfony\Component\HttpFoundation\RequestStack;
class YourController extends AbstractController
{
public function yourFormAction(Request $request, RequestStack $requestStack)
{
// ...
$session = $request->getSession();
$session->set('referer', $requestStack->getMasterRequest()->getRequestUri());
// ...
}
}
上述代码中,我们注入了 RequestStack
,并使用它来获取主请求,然后获取请求 URI,将其保存在会话中。
表单提交后,控制器可以通过获取刚刚存储的前一个 URL 来重定向回之前的页面。
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Session\SessionInterface;
class YourController extends AbstractController
{
public function yourSubmitAction(Request $request, SessionInterface $session)
{
// ...
$referer = $session->get('referer');
$session->remove('referer');
$url = $referer ?: $this->generateUrl('homepage');
return $this->redirect($url);
}
}
上述代码中,我们从会话中获取之前的存储 URL,然后在重定向回之前的页面后将其从会话中删除。
如果之前的 URL 没有找到,我们则重定向至首页。
使用会话来存储前一个 URL 到 Symfony 4 中,可更好地保护表单信息,尤其针对 referer 被篡改的情况,确保了安全性。