如何解决Symfony 5.3.10中删除分类时的Autowire自动装配报错问题
Cannot autowire argument $category of "App\Controller\AdminController::deleteCategory()": it references class "App\Entity\Category" but no such service exists.
这个报错的核心原因是Symfony默认不会自动把路由参数{id}转换为对应的Category实体对象,你用实体类型直接接收路由参数的写法依赖Doctrine的参数转换器功能,该功能未正确启用或配置时就会抛出上述错误。
解决方法1:手动查询实体(无需额外依赖,推荐新手使用)
直接修改控制器的deleteCategory方法,接收整型id参数,手动查询对应分类实体:
<?php // AdminController.php 里的方法修改为如下 #[Route('/delete-category/{id}', name: 'delete_category')] public function deleteCategory(int $id): Response { $category = $this->getDoctrine()->getRepository(Category::class)->find($id); // 处理分类不存在的异常情况 if (!$category) { throw $this->createNotFoundException('请求的分类不存在'); } $entityManager = $this->getDoctrine()->getManager(); $entityManager->remove($category); $entityManager->flush(); return $this->redirectToRoute('categories'); }
解决方法2:启用Doctrine参数转换器,保留实体直接注入的写法
- 首先确认你已安装参数转换器依赖包,未安装的话执行命令:
composer require sensio/framework-extra-bundle - 在控制器方法上添加
Entity注解明确参数转换规则,修改后的代码如下:
<?php namespace App\Controller; // 新增引入注解类 use Sensio\Bundle\FrameworkExtraBundle\Configuration\Entity; use App\Entity\Category; use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; use Symfony\Component\HttpFoundation\Response; use Symfony\Component\Routing\Annotation\Route; #[Route('/admin')] class AdminController extends AbstractController { #[Route('/delete-category/{id}', name: 'delete_category')] // 新增下面这行注解,指定用id查询Category实体 #[Entity('category', expr: 'repository.find(id)')] public function deleteCategory(Category $category): Response { $entityManager = $this->getDoctrine()->getManager(); $entityManager->remove($category); $entityManager->flush(); return $this->redirectToRoute('categories'); } }
- 额外检查你的
App\Entity\Category类是否已添加正确的Doctrine实体注解,类上方必须有#[ORM\Entity]标记,才能被参数转换器识别。
你现有的CategoryTreeAdminList代码中生成删除链接的逻辑是正确的,不需要修改。
内容的提问来源于stack exchange,提问作者Saddam Hawari
相关产品推荐
相关产品推荐

