Symfony报错:Warning: Attempt to read property "type" on null 排查修复
问题分析与修复方案
错误原因定位
错误Warning: Attempt to read property "type" on null源于表单字段初始化异常、请求处理缺失、路由冲突及模板变量依赖问题,结合你的代码具体问题如下:
1. Edit方法未传入Country表单选项
edit方法创建UserType表单时,未传递country参数,尽管UserType设置了默认空数组,但渲染ChoiceType字段时,可能因配置不完整导致字段类型对象为null。
2. Store方法未处理请求
store方法创建表单后未调用handleRequest($request),表单无法解析提交的数据,验证逻辑永远不触发,返回模板时易引发表单字段异常。
3. Success方法路由冲突且变量缺失
success方法路由/user与index方法路由重复,跳转后实际执行success方法,但该方法渲染index.html.twig时未传入模板依赖的users变量,模板访问该变量时触发null属性读取错误。
4. 模板路径不一致
create方法渲染user/create.html.twig,而store方法验证失败时渲染user_form/create.html.twig,路径不一致可能导致模板加载异常。
修复步骤
修复Edit方法
创建表单时添加country选项:
#[Route('/user/edit/{id}', name: 'form_edit')] public function edit(Request $request, int $id, UsersRepository $userRepository): Response { $user = $userRepository->find($id); if (!$user) { throw $this->createNotFoundException('User not found'); } // 添加country选项 $form = $this->createForm(UserType::class, $user, [ 'country' => $this->getCountries(), ]); $form->handleRequest($request); if ($form->isSubmitted() && $form->isValid()) { $this->entityManager->flush(); return $this->redirectToRoute('form_success'); } return $this->render('user_form/edit.html.twig', [ 'form' => $form->createView(), 'user' => $user, ]); }
修复Store方法
新增handleRequest调用,让表单处理提交数据:
#[Route('/user/store', name: 'user_store')] public function store(Request $request): Response { $user = new Users(); $form = $this->createForm(UserType::class, $user, [ 'country' => $this->getCountries(), ]); // 新增:处理请求 $form->handleRequest($request); if ($form->isSubmitted() && $form->isValid()) { $this->entityManager->persist($user); $this->entityManager->flush(); return $this->redirectToRoute('form_success'); } return $this->render('user_form/create.html.twig', [ 'form' => $form->createView(), ]); }
修复Success方法
修改路由路径避免冲突,并传入模板所需的users变量:
// 修改路由路径为/user/success,避免和index的/user冲突 #[Route('/user/success', name: 'form_success')] public function success(UsersRepository $userRepository): Response { $users = $userRepository->findAll(); return $this->render('user_form/index.html.twig', [ 'users' => $users, ]); }
统一模板路径
修改create方法的模板路径,与store方法保持一致:
#[Route('/user/create', name: 'user_create')] public function create(Request $request): Response { $user = new Users(); $form = $this->createForm(UserType::class, $user, [ 'country' => $this->getCountries(), ]); // 修改模板路径为user_form/create.html.twig return $this->render('user_form/create.html.twig', [ 'form' => $form->createView(), ]); }
内容的提问来源于stack exchange,提问作者eremalauda
相关产品推荐
相关产品推荐

