Я хочу использовать свой недавно созданный проект 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?
Почему я получаю эту ошибку и как заставить эту структуру работать правильно?




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