Symfony表单报错:IdReader::getIdValue()参数应为对象或null,传入字符串
解决Symfony中EntityType表单关联Category时的IdReader错误
错误场景与提示
编辑博客文章时,为BlogType添加关联Category的EntityType表单后,触发以下错误:
Argument 1 passed to Symfony\Bridge\Doctrine\Form\ChoiceList\IdReader::getIdValue() must be an object or null, string given
控制器中调用dd($post)时触发该错误。
问题代码
BlogType表单配置
->add('category', EntityType::class, [ 'class' => Category::class, 'choice_label' => function(Category $category) { return $category->getName(); } ])
Category实体关键代码
/** * @ORM\Column(type="string", length=255) */ private $name; public function __toString() { return $this->name; } public function getId(): ?int { return $this->id; } public function getName(): ?string { return $this->name; }
控制器代码
/** * @Route("/edit-post/{id}", name="edit-post") */ public function editBlogPost(ManagerRegistry $manager, $id){ $post = $manager->getRepository(Blog::class)->find($id); $form = $this->createForm(BlogType::class, $post); $form->handleRequest($request); dd($post); }
解决方案
1. 修正Blog实体的Category关联定义
确保Blog实体中category字段是正确的Doctrine ManyToOne关联,而非普通字符串字段:
// Blog.php /** * @ORM\ManyToOne(targetEntity=Category::class) * @ORM\JoinColumn(nullable=false) */ private $category; // 补充对应的getter和setter public function getCategory(): ?Category { return $this->category; } public function setCategory(?Category $category): self { $this->category = $category; return $this; }
2. 检查并修复数据库数据
确认blog表的category字段存储的是Category的ID(整数类型),而非分类名称字符串。若之前错误存储了名称,需批量更新数据,将对应分类的ID填入该字段。
3. 补充控制器的Request依赖注入
控制器方法中缺失Request $request参数,导致handleRequest调用失败,需修正:
public function editBlogPost(ManagerRegistry $manager, Request $request, $id){ $post = $manager->getRepository(Blog::class)->find($id); $form = $this->createForm(BlogType::class, $post); $form->handleRequest($request); dd($post); }
4. 验证Category实体主键配置
确保Category实体的主键$id是正确的自增主键定义:
// Category.php /** * @ORM\Id * @ORM\GeneratedValue * @ORM\Column(type="integer") */ private $id;
内容的提问来源于stack exchange,提问作者steven zong
相关产品推荐
相关产品推荐

