📜  在表单页面中获取上一个 url symfony 4 - PHP (1)

📅  最后修改于: 2023-12-03 14:51:33.517000             🧑  作者: Mango

在表单页面中获取上一个 URL Symfony 4 - PHP

当在表单提交后需要返回之前的页面时,需要获取之前的URL地址。在 Symfony 4 中,可以使用 PHP SuperGlobal 变量$_SERVER['HTTP_REFERER'] 来获取前一个 URL,但是这种方法并不可靠,因为有些浏览器可能不会发送 referer 信息,另外 referer 也可以被人为地篡改。因此,Symfony 官方并不建议使用该方法。

建议的方法是在控制器中将当前 URL 保存到会话中,然后在表单提交后使用 save referer 的服务来获取之前的 URL。

步骤
1. 在控制器中储存当前 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,将其保存在会话中。

2. 获取前一个 URL

表单提交后,控制器可以通过获取刚刚存储的前一个 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 被篡改的情况,确保了安全性。