【发布时间】:2019-01-12 05:12:24
【问题描述】:
我以为我完全理解 Symfony 的自动装配行为,但一定有我遗漏的东西,我希望有人能填补空白。
三个问题开始:
- 主应用程序与捆绑软件中的 Symfony 自动装配行为是否存在差异?
- 如果您要求 Symfony 自动装配捆绑服务,它会完全忽略捆绑
services.yaml文件中的服务定义吗? - Symfony 4 中的 setter 注入功能是否存在已知问题?
我在使用 setter 注入的包中有一个服务定义,但是当我要求 Symfony 自动装配我的包服务时,甚至当我要求 Symfony 从自动装配中排除服务时,它似乎完全被 Symfony 忽略了.
我的应用程序正在使用 Symfony v4.1.3。
我已将我的 Bundle 包含在我的应用程序 bundles.php 文件中。
<?php
return [
//... core bundles,
Acme\\Symfony\\AcmeCustomBundle\\AcmeCustomBundle::class => ['all' => true]
];
在 default Symfony 应用程序 services.yaml 文件中,我已要求 Symfony 使用以下内容自动连接我的捆绑服务:
Acme\Symfony\AcmeCustomBundle\:
resource: '../vendor/acme-symfony/custom-bundle/*'
exclude: '../vendor/acme-symfony/custom-bundle/{Model,Tests}'
在我位于../vendor/acme-symfony/custom-bundle/Resources/config/services.yaml 的捆绑包services.yaml 文件中,我有以下内容:
parameters:
services:
Acme\Symfony\AcmeCustomBundle\Search\ConfigurationReader:
calls:
- method: setIndex
arguments:
$index: '%elasticsearch.index%'
- method: setSchema
arguments:
$schema: '%elasticsearch.schema%'
参数是在我的捆绑扩展类(扩展可配置扩展)中设置的,并且我已经验证了这些参数确实存在并且正在使用以下方法进行设置:
$container->setParameter('elasticsearch.index', $mergedConfigs['elasticsearch']['index']);
$container->setParameter('elasticsearch.schema', $mergedConfigs['elasticsearch']['schema']);
现在回到问题。 Symfony 没有执行 setter 注入,即使我通过执行以下操作告诉 Symfony 不要自动装配上述服务:
Acme\Symfony\AcmeCustomBundle\:
resource: '../vendor/acme-symfony/custom-bundle/*'
exclude: '../vendor/acme-symfony/custom-bundle/{Model,Tests,Search}'
不过,我确实让 Symfony 来配置我的服务
- 关闭了上述服务的自动装配
- 使用工厂方法创建服务
这样回答了我上面的第二个问题,但我不是 100% 确定的。尽管如此,我宁愿不必使用工厂类来解决 Symfony 可能存在的问题,或者我对 setter 注入/自动装配的真正工作原理缺乏了解。
谁能看到我遗漏的明显东西?
【问题讨论】:
标签: symfony dependency-injection factory autowired symfony4