Symfony 7中$request->toArray()触发重定向问题解决
解决方法
1. 替换toArray()为正确的表单数据获取方式
$request->toArray()仅适用于JSON格式的请求体(Content-Type: application/json),而你的表单提交的是application/x-www-form-urlencoded格式数据,应该用$request->request->all()来获取:
#[Route('/settings/email', name: 'settings.email', methods: ['PUT'])] public function updateEmail(Request $request): Response { $formData = $request->request->all(); // 表单name为update_email_form[email],按层级获取email值 $email = $formData['update_email_form']['email'] ?? null; dd($email); }
2. 验证CSRF Token(关键,否则会触发拦截重定向)
你的表单包含CSRF Token字段update_email_form[_token],必须在控制器中手动验证,否则Symfony的CSRF保护机制会拦截请求并触发重定向:
use Symfony\Component\Security\Csrf\CsrfTokenManagerInterface; use Symfony\Component\Security\Core\Exception\AccessDeniedException; #[Route('/settings/email', name: 'settings.email', methods: ['PUT'])] public function updateEmail(Request $request, CsrfTokenManagerInterface $csrfTokenManager): Response { $formData = $request->request->all(); $token = $formData['update_email_form']['_token'] ?? ''; // 验证CSRF Token,参数需与表单name前缀一致(update_email_form) if (!$csrfTokenManager->isTokenValid(new CsrfToken('update_email_form', $token))) { throw new AccessDeniedException('Invalid CSRF token.'); } $email = $formData['update_email_form']['email'] ?? null; dd($email); }
3. 更规范的方式:使用Symfony表单组件处理
如果表单是通过Symfony表单生成器创建的,建议直接用表单类处理,自动完成CSRF验证、数据映射和错误处理:
假设你有对应的表单类UpdateEmailFormType:
use App\Form\UpdateEmailFormType; use Symfony\Component\Form\FormFactoryInterface; #[Route('/settings/email', name: 'settings.email', methods: ['PUT'])] public function updateEmail(Request $request, FormFactoryInterface $formFactory): Response { $form = $formFactory->create(UpdateEmailFormType::class) ->handleRequest($request); if ($form->isSubmitted() && $form->isValid()) { $data = $form->getData(); $email = $data['email']; // 若表单映射到实体,直接取实体的email属性即可 dd($email); } // 验证失败时返回原页面或错误响应 return $this->redirectToRoute('settings'); }
重定向原因说明
$request->toArray()用于解析JSON请求体,你的表单提交的是表单编码数据,调用该方法会抛出异常,触发Symfony异常处理重定向;- 未验证CSRF Token,Symfony的CSRF保护机制会拦截请求,自动重定向到来源页面。
内容的提问来源于stack exchange,提问作者Raphael
相关产品推荐
相关产品推荐

