Я хочу использовать свой недавно созданный проект Symfony 4 с PHP-DI 6 и PHP-DI Symfony Bridge 3.
Моя структура проекта выглядит так:
|-config
|---dependencies
|-----common.php
...
|-src
...
|-Interop
|---Api
|---Website
|-----Controller
|-------IndexController.php
...
|---Services
|-----Dummy
|-------FooService.php
|-------FooServiceInterface.php
...
|-Kernel.php
Классы FooService
и BuzService
реализуют FooServiceInterface
.
/config/dependencies/common.php
return [
IndexController::class => DI\create(IndexController::class),
FooServiceInterface::class => DI\create(FooService::class),
];
IndexController
получает экземпляр введенного FooServiceInterface
.
public function __construct(FooServiceInterface $fooService)
{
$this->fooService = $fooService;
}
Kernel
расширяет DI\Bridge\Symfony\Kernel
и реализует его buildPHPDIContainer(...)
:
protected function buildPHPDIContainer(PhpDiContainerBuilder $builder)
{
$builder->addDefinitions(__DIR__ . '/../config/dependencies/common.php');
return $builder->build();
}
Кажется, все настроено в соответствии с документацией PHP-DI Symfony Bridge.
Все нормально работает, если есть только одна реализация FooServiceInterface
. Но когда я добавлю еще один, например:
class BuzService implements FooServiceInterface
Я получаю сообщение об ошибке:
RuntimeException
Не удается выполнить автоматическое подключение службы «App \ Interop \ Website \ Controller \ IndexController»: аргумент «$ fooService» метода «__construct ()» ссылается на интерфейс «App \ Services \ Dummy \ FooServiceInterface», но такой службы не существует. Возможно, вам следует присвоить этому интерфейсу псевдоним одной из существующих служб: «App \ Services \ Dummy \ BuzService», «App \ Services \ Dummy \ FooService». Вы создали класс, реализующий этот интерфейс?
Почему я получаю эту ошибку и как заставить эту структуру работать правильно?