如何为控制器使用PHP-DI Symfony桥接器?

如何为控制器使用PHP-DI Symfony桥接器?,symfony,dependency-injection,symfony4,php-di,Symfony,Dependency Injection,Symfony4,Php Di,我想使用我最近建立的带有PHP-DI 6和PHP-DI Symfony Bridge 3的Symfony 4项目 我的项目结构如下所示: |-config |---dependencies |-----common.php ... |-src ... |-Interop |---Api |---Website |-----Controller |-------IndexController.php ... |---Services |-----Dummy |-------FooService.p

我想使用我最近建立的带有PHP-DI 6和PHP-DI Symfony Bridge 3的Symfony 4项目

我的项目结构如下所示:

|-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;
}
内核
扩展了
DI\Bridge\Symfony\Kernel
并实现了它的
buildPHPDIContainer(…)

一切似乎都是按计划安排的

如果只有一个
FooServiceInterface
的实现,那么一切都可以正常工作。但当我再添加一个时,例如:

class BuzService implements FooServiceInterface
我得到一个错误:

运行时异常

无法自动连线服务 “App\Interop\Website\Controller\IndexController”:参数 方法“\uu construct()”的“$fooService”引用了接口 “App\Services\Dummy\FooServiceInterface”,但不存在此类服务。 您可能应该将此接口别名为这些现有接口之一 服务:“App\services\Dummy\BuzService”, “App\Services\Dummy\FooService”。你是否创建了一个 实现这个接口


为什么会出现此错误以及如何使此结构正常工作?

此错误消息看起来像Symfony错误消息,而不是PHP-DI错误消息

我猜Symfony会扫描所有类以进行自动连接,包括控制器(即使它不是必需的)


这是我第一次听说这个,我想你需要完全禁用Symfony的自动连线,或者对某些特定的文件夹?如果您可以向PHP-DI的文档发送一个请求,那将非常棒:)

Hello Matthieu!谢谢你的回答!现在它开始工作了。我的代码中有两个地方需要修复:1。Symfony:在
服务.yaml
中,至少必须进行以下更改之一:a。将
services.autoconfigure
(非
service.autowire
)设置为
false
和/或b。将
Controller
目录的路径添加到
service.App\.exclude
列表中(或完全禁用
services.App
)。2.PHP-DI:我使用的是
DI\create(…)
并得到错误“[…]无法解决:参数[…]没有定义或可猜测的值”。这个调用必须被
DI\get(…)
替换。稍后我将向PHP-DI的文档发送一个pull请求。
class BuzService implements FooServiceInterface