You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 23:25:25