Как использовать 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

Cannot autowire service "App\Interop\Website\Controller\IndexController": argument "$fooService" of method "__construct()" references interface "App\Services\Dummy\FooServiceInterface" but no such service exists. You should maybe alias this interface to one of these existing services: "App\Services\Dummy\BuzService", "App\Services\Dummy\FooService". Did you create a class that implements this interface?

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

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Symfony Station Communiqué - 17 февраля 2023 г
Symfony Station Communiqué - 17 февраля 2023 г
Это коммюнике первоначально появилось на Symfony Station , вашем источнике передовых новостей Symfony, PHP и кибербезопасности.
Управление ответами api для исключений на Symfony с помощью KernelEvents
Управление ответами api для исключений на Symfony с помощью KernelEvents
Много раз при создании api нам нужно возвращать клиентам разные ответы в зависимости от возникшего исключения.
1
0
148
1

Ответы 1

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

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

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

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

automatix 23.03.2018 17:28

Я отправлю запрос на перенос в документацию PHP-DI позже.

automatix 23.03.2018 17:31

Другие вопросы по теме