Symfony自动注入报错:Signal类已在services.yaml中排除
问题解决步骤
1. 修复Controller核心错误
错误直接原因是index方法中多余的Signal $signal参数——列表页不需要单个Signal实例,且实体类默认在config/services.yaml中被排除自动装配,导致Autowire无法创建该实例。同时原代码的查询逻辑未获取Signal列表,也未正确关联过滤条件。
修改后的Controller代码:
private $doctrine; public function __construct(ManagerRegistry $doctrine) { $this->doctrine = $doctrine; } #[Route('/', name: 'app_signal_index', methods: ['GET'])] public function index(Request $request): Response { $priority = $request->query->get('priority'); $contributor = $request->query->get('contributor'); $status = $request->query->get('status'); // 获取Signal仓库并构建查询 $signalRepo = $this->doctrine->getRepository(Signal::class); $qb = $signalRepo->createQueryBuilder('s') ->leftJoin('s.transition', 't') // 需与Signal实体中关联TransitionSignal的属性名一致 ->leftJoin('s.resolution', 'r') // 需与Signal实体中关联ResolutionSignal的属性名一致 ->addSelect('t', 'r'); // 优先级过滤 if ($priority !== null) { $qb->andWhere('t.priority = :priority') ->setParameter('priority', $priority); } // 贡献者过滤 if ($contributor !== null) { $qb->andWhere('t.contributor = :contributor') ->setParameter('contributor', $contributor); } // 状态过滤 if ($status !== null) { $qb->andWhere('r.actionPlanStatus = :status') ->setParameter('status', $status); } $signals = $qb->getQuery()->getResult(); return $this->render('signal/index.html.twig', [ 'signals' => $signals, // 传递列表数据,匹配Twig循环变量 ]); }
2. 修正Twig模板变量引用
原模板存在变量名不匹配、全局引用关联对象的问题,修改后代码:
{% for signal in signals %} <tr> <td>{{ signal.id }}</td> <td>{{ signal.date ? signal.date|date('Y-m-d H:i:s') : '' }}</td> <td>{{ signal.address }}</td> <td>{{ signal.description }}</td> <td>{{ signal.transition.priority ?? '' }}</td> <td>{{ signal.transition.contributor ?? '' }}</td> <td>{{ signal.resolution.actionPlanStatus ?? '' }}</td> <td> <div class="mt-3"> <div class="btn-group" role="group" aria-label="Basic example"> <a href="{{ path('app_signal_show', {'id': signal.id}) }}" class="btn btn-secondary" role="button">show</a> <a href="{{ path('app_signal_edit', {'id': signal.id}) }}" class="btn btn-secondary" role="button">edit</a> </div> </div> </td> </tr> {% else %} <tr> <td colspan="8">no records found</td> <!-- 修正列数匹配实际表格列数 --> </tr> {% endfor %}
使用
?? ''处理关联对象为空的情况,避免模板报错。
3. 验证实体关联配置
确保Signal实体正确定义与其他实体的关联,示例:
// App\Entity\Signal.php use App\Entity\TransitionSignal; use App\Entity\ResolutionSignal; use Doctrine\ORM\Mapping as ORM; #[ORM\Entity(repositoryClass: SignalRepository::class)] class Signal { // ... 其他字段定义 #[ORM\OneToOne(targetEntity: TransitionSignal::class, mappedBy: 'signal')] // 根据实际关联类型调整 private ?TransitionSignal $transition = null; #[ORM\OneToOne(targetEntity: ResolutionSignal::class, mappedBy: 'signal')] private ?ResolutionSignal $resolution = null; // ... 对应getter/setter方法 }
内容的提问来源于stack exchange,提问作者Fatma Ellouze
相关产品推荐
相关产品推荐

