如何为控制器使用PHP-DI Symfony桥接器?
我想使用我最近建立的带有PHP-DI 6和PHP-DI Symfony Bridge 3的Symfony 4项目 我的项目结构如下所示:如何为控制器使用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
|-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