我想将我最近设置的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 => DIcreate(IndexController::class),
FooServiceInterface::class => DIcreate(FooService::class),
];
IndexController
获取注入FooServiceInterface
的实例。
public function __construct(FooServiceInterface $fooService)
{
$this->fooService = $fooService;
}
Kernel
扩展了DIBridgeSymfonyKernel
并实现了其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
我收到一个错误:
运行时异常
无法自动连线服务 "App\Interop\Website\Controller\IndexController":参数 方法"__construct()"引用接口的"$fooService" "App\Services\Dummy\FooServiceInterface",但不存在此类服务。 您可能应该将此接口别名为这些现有接口之一 服务: "App\Services\Dummy\BuzService", "App\Services\Dummy\FooService"。您是否创建了一个类 实现此接口?
为什么我会收到此错误以及如何使此结构正常工作?
此错误消息看起来像 Symfony 错误消息,而不是 PHP-DI 错误消息。
我猜Symfony会扫描你所有的类进行自动布线,包括你的控制器(即使这不是必需的)。
这是我第一次听说这个,我想你需要完全禁用Symfony的自动连线,或者对于某些特定的文件夹?如果你能向 PHP-DI 的文档发送拉取请求,那就太棒了:)