Symfony 6.1中RecipeController的edit方法自动注入失败问题求助
Symfony 6.1中RecipeController的edit方法自动注入失败问题求助
嘿,我看你遇到了Symfony里控制器方法自动注入实体的报错,这个问题其实很常见——Symfony默认不会把实体类注册为容器服务,所以你直接在edit()方法里声明Recipe $recipe来自动注入的话,容器找不到对应的服务就会抛出这个错误啦。
问题根源
实体类(比如你的App\Entity\Recipe)是Doctrine用来映射数据库表的模型,不是Symfony服务容器里的服务,所以没法通过Autowire直接注入到控制器方法中。要在控制器里获取对应的实体实例,得用Symfony自带的ParamConverter功能,它会自动根据路由参数去数据库加载对应的实体。
解决步骤
给edit路由添加实体主键参数
首先要确保你的edit路由里包含实体的主键参数(通常是{id}),这样ParamConverter才能知道要加载哪条数据:#[Route('/recettes/edit/{id}', name: 'recipe.edit')]在控制器方法中直接声明实体参数
接着在edit()方法里直接声明Recipe $recipe参数,Symfony会自动通过ParamConverter根据路由里的id值去数据库查找对应的实体:public function edit(Request $request, Recipe $recipe, EntityManagerInterface $em): Response { // 这里的$recipe已经是从数据库加载好的实体实例了 $form = $this->createForm(RecipeType::class, $recipe); $form->handleRequest($request); if ($form->isSubmitted() && $form->isValid()) { $em->flush(); // 因为是更新现有实体,persist可以省略 $this->addFlash('success', 'Recette modifiée avec succès !'); return $this->redirectToRoute('recipe.index'); } return $this->render('recipe/edit.html.twig', [ 'form' => $form->createView(), 'recipe' => $recipe ]); }
额外注意事项
- 确保你的
Recipe实体类正确配置了主键注解,比如:use Doctrine\ORM\Mapping as ORM; #[ORM\Entity(repositoryClass: RecipeRepository::class)] class Recipe { #[ORM\Id] #[ORM\GeneratedValue] #[ORM\Column(type: 'integer')] private ?int $id = null; // ... 其他属性和方法 } - 如果你的实体主键不是
id(比如用slug),需要在方法上添加ParamConverter注解来映射参数:use Sensio\Bundle\FrameworkExtraBundle\Configuration\ParamConverter; #[Route('/recettes/edit/{slug}', name: 'recipe.edit')] #[ParamConverter('recipe', options: ['mapping' => ['slug' => 'slug']])] public function edit(Request $request, Recipe $recipe): Response { // ... 方法内容 } - 如果找不到对应id的实体,Symfony会自动返回404响应,不用额外处理~
备注:内容来源于stack exchange,提问作者sam22i
相关产品推荐
相关产品推荐

