【发布时间】:2019-02-09 09:08:06
【问题描述】:
我有一个小的外部库,它公开了许多类。
在我的 symfony4 项目中,我想从供应商处声明我的类,作为具有 autowire 和 public 的服务。 所以我已经将我的库包含在 composer 中,并将这样的 psr 配置添加到 composer.json 中:
"autoload": {
"psr-4": {
"App\\": "src/",
"ExternalLibrary\\": "vendor/external-library/api/src/"
}
}
之后我尝试将我的 services.yaml 更改为 symfony,如下所示:
ExternalLibrary\:
resource: '../vendor/external-library/api/src/*'
public: true
autowire: true
如果我启动测试或运行应用程序返回此错误:
Cannot autowire service "App\Domain\Service\MyService": argument "$repository" of method "__construct()" references interface "ExternalLibrary\Domain\Model\Repository" but no such service exists. You should maybe alias this interface to the existing "App\Infrastructure\Domain\Model\MysqlRepository" service.
如果我在 services.yaml 中声明该接口,它可以正常工作:
ExternalLibrary\Domain\Model\Lotto\Repository:
class: '../vendor/external-library/api/src/Domain/Model/Repository.php'
public: true
autowire: true
但是我有很多类并且我不想声明每个类,如何在不声明每个服务的情况下修复 services.yaml?
谢谢
【问题讨论】:
-
不确定加载整个目录是否是个好主意。这可能会对容器构建过程产生影响。无论如何,对于构造函数参数中的每个接口,您都需要手动声明一个类或别名。
-
好的,你能举一个你认为应该解决的例子吗?谢谢@FabienPapet
-
似乎您的第一种方法应该有效。回到它然后运行“bin/console debug:container”,看看你是否有任何 ExternalLibrary 服务。您可能必须注释掉 App 命名空间的行,才能克服原来的错误。
-
@Cerad 问题是我正在自动装配一个接口,并且应该使用别名声明例如
-
我很确定您需要将接口 ExternalLibrary\Domain\Model\Repository 设为 ExternalLibrary\Domain\Model\Lotto\Repository 的别名。我们的cmets越过了。 autowire 对接口没有多大帮助。以下面答案的最后一部分为例。
标签: php symfony dependency-injection