Symfony4无法通过参数类型提示自动注入实体的问题排查
Symfony删除任务时出现类型错误的排查
现有代码
Twig模板
{% for task in tasks %} <li {% if task.status %} class="checked" {% endif %}> <a href="{{path('switch_status', {'id':task.id})}}"> <span class="task-list-item">{{task.title|escape('html')}} </span> </a> <a onclick="return confirm('Are you sure to delete?')" href="{{ path('task_delete', {'id':task.id}) }}"> <span class="close">X</span> </a> </li> {% endfor %}
删除任务控制器
/** * @Route("/delete/{id}", name="task_delete") */ public function task_delete(Task $id): Response { $entitiyManager = $this->getDoctrine()->getManager(); $entitiyManager->remove($id); $entitiyManager->flush(); return $this->redirectToRoute('index'); }
触发的错误
App\Controller\ToDoListController::task_delete(): Argument #1 ($id) must be of type App\Entity\Task, string given, called in D:\Career\Learn\Symfony\Udemy\Robert Apollo - Beginner To Advanced\2. First App in Symfony\my_project\vendor\symfony\http-kernel\HttpKernel.php on line 169
错误原因及修复方案
这个错误的核心是Symfony的参数转换器没有把路由中的id字符串转换为对应的Task实体对象,导致直接传入了字符串类型的id值。以下是具体排查和修复步骤:
检查实体类配置
确保Task实体类的主键字段id已正确通过Doctrine注解配置:// src/Entity/Task.php use Doctrine\ORM\Mapping as ORM; /** * @ORM\Entity(repositoryClass=TaskRepository::class) */ class Task { /** * @ORM\Id * @ORM\GeneratedValue * @ORM\Column(type="integer") */ private $id; // 其他字段和getter/setter方法 }确认控制器已导入实体类
在控制器文件顶部必须导入Task实体:use App\Entity\Task;显式指定参数转换器(可选但保险)
如果自动转换不生效,可以添加@ParamConverter注解强制转换,同时建议把参数名改成更语义化的$task:use Sensio\Bundle\FrameworkExtraBundle\Configuration\ParamConverter; /** * @Route("/delete/{id}", name="task_delete") * @ParamConverter("task", class="App\Entity\Task") */ public function task_delete(Task $task): Response { $entityManager = $this->getDoctrine()->getManager(); $entityManager->remove($task); $entityManager->flush(); return $this->redirectToRoute('index'); }修正拼写错误
代码中$entitiyManager是拼写错误,正确应为$entityManager,虽然这不是当前类型错误的原因,但会导致后续数据库操作失败,建议立即修正。
内容的提问来源于stack exchange,提问作者Dime
相关产品推荐
相关产品推荐

