Класс Autowire с интерфейсом в качестве параметра в Symfony4

#php #symfony

#php #symfony

Вопрос:

Учитывая класс Publisher , подобный этому:

 <?php

namespace AppUtilPublisher;


use SymfonyComponentMercureUpdate;
use SymfonyComponentMessengerMessageBusInterface;

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 :

 SymfonyComponentMessengerMessageBusInterface: ~

AppUtilPublisherPublisher:
    autowire: true
    arguments: ['@SymfonyComponentMessengerMessageBusInterface']
  

Но я получаю сообщение об ошибке:

Не удается создать экземпляр интерфейса Symfony Component Messenger MessageBusInterface

Связано ли это с MessageBusInterface или я делаю что-то не так с автозапуском. Я следил за документами Symfony для автоматического подключения, и они кажутся одинаковыми?

Спасибо!

Ответ №1:

Я полагаю, MessageBusInterface что сервис уже объявлен компонентом Symfony Messenger. Попробуйте удалить SymfonyComponentMessengerMessageBusInterface: ~ из вашего services.yaml , иначе вы переопределяете определение по умолчанию.

Примечание для пояснения: MessageBusInterface служба на самом деле не существует, она является псевдонимом службы «шины по умолчанию». Вы можете объявить другие шины, см. документацию