首页 > 解决方案 > 在 Symfony4 中使用接口作为参数的 Autowire 类

问题描述

给定这样的类Publisher

<?php

namespace App\Util\Publisher;


use Symfony\Component\Mercure\Update;
use Symfony\Component\Messenger\MessageBusInterface;

class Publisher
{

    protected $topic = null;
    protected $bus;

    /**
     * Publisher constructor.
     * @param MessageBusInterface $bus
     */
    public function __construct(MessageBusInterface $bus)
    {
        $this->topic = getenv('TOPIC_MAIN_URL');
        $this->bus = $bus;
    }

    ...

}

我想像这样在我的控制器中自动装配它:

/**
 * @Route("/_exp/_exp", name="exp")
 */
public function expAction(Publisher $publisher)
{
    ...
}

我将此添加到我的services.yaml

Symfony\Component\Messenger\MessageBusInterface: ~

App\Util\Publisher\Publisher:
    autowire: true
    arguments: ['@Symfony\Component\Messenger\MessageBusInterface']

但我收到一个错误:

无法实例化接口 Symfony\Component\Messenger\MessageBusInterface

这与 MessageBusInterface 相关还是我在自动装配方面做错了什么。我按照Symfony 文档进行自动装配,它们似乎是一样的?

谢谢!

标签: phpsymfony

解决方案


我相信MessageBusInterfaceSymfony Messenger 组件已经声明了服务。尝试Symfony\Component\Messenger\MessageBusInterface: ~从您的中删除services.yaml,否则您将覆盖默认定义。

澄清说明:MessageBusInterface服务实际上并不存在,它是“默认总线”服务的别名。您可以声明其他总线,参见文档


推荐阅读