Symfony 返回错误消息“此类型已被排除在“config/services.yaml”中

问题描述 投票:0回答:1

我正在尝试显示数据库表,我正在使用以下作曲家和树枝:

private $doctrine;

    public function __construct(ManagerRegistry $doctrine)
    {
        $this->doctrine = $doctrine;
    }
    #[Route('/', name: 'app_signal_index', methods: ['GET'])]
    public function index(Request $request, Signal $signal): Response
    {
        $priority = $request->query->get('priority');
        $contributor = $request->query->get('contributor');
        $status = $request->query->get('status');
        $transition = null;
        $resolution = null;
    
        if ($priority !== null) {
            $transition = $this->doctrine->getRepository(TransitionSignal::class)->findBy(['transition' => $priority]);
        }
    
        if ($contributor !== null) {
            $transition = $this->doctrine->getRepository(TransitionSignal::class)->findBy(['transition' => $contributor]);
        }
    
        if ($status !== null) {
            $resolution = $this->doctrine->getRepository(ResolutionSignal::class)->findBy(['resolution' => $status]);
        }
    
        return $this->render('signal/index.html.twig', [
            'signal' => $signal,
            'transition' => $transition,
            'resolution' => $resolution,
        ]);

在树枝中:

{% 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>{{ transition.priority }}</td>
        <td>{{ transition.contributor }}</td>
        <td>{{ 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="26">no records found</td>
        </tr>
    {% endfor %}

服务器返回以下错误消息: 无法自动装配“App\Controller\SignalController::index()”的参数 $signal:它需要“App\Entity\Signal”的实例,但此类型已在“config/services.yaml”中排除。

我希望显示数据库中的表格

symfony
1个回答
0
投票

这是一个非常简单的答案。您正在尝试将

Signal
实体自动连接到您的路线函数中。默认的 Symfony 依赖注入(用于自动装配依赖项)被配置为排除某些类。通常,它在您的
config/services.yaml

中看起来像这样
services: 

    # Some other config

    App\:
        resource: '../src/'
        exclude:
            - '../src/DependencyInjection/'
            - '../src/Entity/'
            - '../src/Kernel.php'

这意味着您的实体不会由框架自动装配。

但是,这在您的用例中有一个简单的修复。在路由中注入实体时,您应该提供一些有关如何使用

EntityValueResolver
检索实体的信息。您可以在here了解它,只需确保切换到您确切的 Symfony 版本即可。

然后您应该修改您的路线,以包含一些有关如何获取实体的信息。假设您想通过 ID 获取实体。 路线看起来像这样

    #[Route('/{id}', name: 'app_signal_index', methods: ['GET'])]
    public function index(Request $request, Signal $signal): Response
    {
        $priority = $request->query->get('priority');
        $contributor = $request->query->get('contributor');
        $status = $request->query->get('status');
        $transition = null;
        $resolution = null;
    
        if ($priority !== null) {
            $transition = $this->doctrine->getRepository(TransitionSignal::class)->findBy(['transition' => $priority]);
        }
    
        if ($contributor !== null) {
            $transition = $this->doctrine->getRepository(TransitionSignal::class)->findBy(['transition' => $contributor]);
        }
    
        if ($status !== null) {
            $resolution = $this->doctrine->getRepository(ResolutionSignal::class)->findBy(['resolution' => $status]);
        }
    
        return $this->render('signal/index.html.twig', [
            'signal' => $signal,
            'transition' => $transition,
            'resolution' => $resolution,
        ]);
    }

如果您想获取整个信号表,就像您在问题中所说的那样,您必须从路由函数中删除

Signal
参数,并使用函数内的存储库来获取所需的实体。另请注意,传递到 Twig 的变量在模板和路线中具有不同的名称(
signal
vs
signals

    #[Route('/', name: 'app_signal_index', methods: ['GET'])]
    public function index(Request $request): Response
    {
        $signals = $this->doctrine->getRepository(Signal::class)->findAll();
        $priority = $request->query->get('priority');
        $contributor = $request->query->get('contributor');
        $status = $request->query->get('status');
        $transition = null;
        $resolution = null;
    
        if ($priority !== null) {
            $transition = $this->doctrine->getRepository(TransitionSignal::class)->findBy(['transition' => $priority]);
        }
    
        if ($contributor !== null) {
            $transition = $this->doctrine->getRepository(TransitionSignal::class)->findBy(['transition' => $contributor]);
        }
    
        if ($status !== null) {
            $resolution = $this->doctrine->getRepository(ResolutionSignal::class)->findBy(['resolution' => $status]);
        }
    
        return $this->render('signal/index.html.twig', [
            'signals' => $signals,
            'transition' => $transition,
            'resolution' => $resolution,
        ]);
    }

你的例子有点奇怪,我无法正确理解你想要完成什么。但似乎您想打印出数据库中的每个信号并包含相关的转换信号?如果您需要更多建议,请提供一些有关用例的信息。

我想指出的另一件事是,您应该将逻辑分离到服务类中并将其注入到控制器中,而不是在控制器中注入 Doctrine。或者至少注入所需的存储库,然后在代码中提供更多的类型安全性。您可以使用构造函数和构造函数属性提升(如果您使用的是 PHP 8 或更高版本)来执行此操作

   public function __construct(
      private TransitionSignalRepository $transitionSignalRepository,
      private ResolutionSignalRepository $resolutionSignalRepository,
   ) {}

您只需致电

$this->doctrine->getRepository(TransitionSignal::class)->findBy(['transition' => $priority]);
,而不是执行
$this->transitionSignalRepository->findBy(['transition' => $priority]);

© www.soinside.com 2019 - 2024. All rights reserved.