Как использовать PHP-DI Symfony Bridge для контроллеров?

Я хочу использовать свой недавно созданный проект 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». Вы создали класс, реализующий этот интерфейс?

Почему я получаю эту ошибку и как заставить эту структуру работать правильно?


person automatix    schedule 18.03.2018    source источник


Ответы (1)


Это сообщение об ошибке выглядит как сообщение об ошибке Symfony, а не PHP-DI.

Я предполагаю, что Symfony сканирует все ваши классы на предмет автоматического подключения, включая ваш контроллер (хотя в этом нет необходимости).

Я впервые слышу об этом. Думаю, вам нужно полностью отключить автоподключение Symfony или для некоторых конкретных папок? Если бы вы могли отправить запрос на перенос в документацию PHP-DI, это было бы здорово :)

person Matthieu Napoli    schedule 19.03.2018
comment
Привет, Матье! Спасибо за ваш ответ! Теперь работает. В моем коде было два места, которые мне пришлось исправить: 1. Symfony: в services.yaml at lease нужно было сделать одно из следующих изменений: a. установите services.autoconfigure (не service.autowire) на false и / или b. добавить путь к каталогу Controller в список service.App\.exclude (или вообще отключить services.App). 2. PHP-DI: я ​​использовал DI\create(...), и ошибка [...] не может быть устранена: параметр [...] не имеет определенного значения или предположения. Этот вызов пришлось заменить на DI\get(...). - person automatix; 23.03.2018
comment
Я отправлю запрос на перенос в документацию PHP-DI позже. - person automatix; 23.03.2018