one*_*eer 3 factory dependency-injection autowired symfony symfony4
我以为我完全理解了Symfony的自动装配行为,但肯定有一些我想念的东西,希望有人能填补空白。
首先要解决三个问题:
services.yaml
文件中的服务定义?我在使用setter注入的捆绑软件中有一个服务定义,但是当我要求Symfony自动捆绑我的捆绑软件服务,甚至当我要求Symfony从自动装配中排除服务时,Symfony似乎会完全忽略它。
我的应用程序正在使用Symfony v4.1.3
。
我已将Bundle包含在我的应用程序bundles.php
文件中。
<?php
return [
//... core bundles,
Acme\\Symfony\\AcmeCustomBundle\\AcmeCustomBundle::class => ['all' => true]
];
Run Code Online (Sandbox Code Playgroud)
在default
Symfony应用程序services.yaml
文件中,我已要求Symfony使用以下内容自动捆绑服务:
Acme\Symfony\AcmeCustomBundle\:
resource: '../vendor/acme-symfony/custom-bundle/*'
exclude: '../vendor/acme-symfony/custom-bundle/{Model,Tests}'
Run Code Online (Sandbox Code Playgroud)
在services.yaml
位于中的捆绑文件中../vendor/acme-symfony/custom-bundle/Resources/config/services.yaml
,我具有以下内容:
parameters:
services:
Acme\Symfony\AcmeCustomBundle\Search\ConfigurationReader:
calls:
- method: setIndex
arguments:
$index: '%elasticsearch.index%'
- method: setSchema
arguments:
$schema: '%elasticsearch.schema%'
Run Code Online (Sandbox Code Playgroud)
这些参数是在我的bundle扩展类中设置的(扩展可配置扩展名),并且我已经验证了这些参数确实存在并且正在使用以下方法进行设置:
$container->setParameter('elasticsearch.index', $mergedConfigs['elasticsearch']['index']);
$container->setParameter('elasticsearch.schema', $mergedConfigs['elasticsearch']['schema']);
Run Code Online (Sandbox Code Playgroud)
现在回到问题所在。即使我通过以下操作告诉Symfony不要自动装配以上服务,Symfony也不会执行setter注入:
Acme\Symfony\AcmeCustomBundle\:
resource: '../vendor/acme-symfony/custom-bundle/*'
exclude: '../vendor/acme-symfony/custom-bundle/{Model,Tests,Search}'
Run Code Online (Sandbox Code Playgroud)
但是,当我使用Symfony时,确实可以配置我的服务
这种回答回答了我上面的第二个问题,但我不是100%确信。尽管如此,我宁愿不必使用工厂类来解决Symfony可能存在的问题,或者我对二传手注入/自动装配的工作原理缺乏了解。
谁能看到我显然想念的东西?
您可以根据需要自动连接其他方法(例如Setter),只需在服务中使用@required批注即可:
/**
* @required
*/
public function setFoo(FooInterface $foo)
{
$this->foo = $foo;
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
1154 次 |
最近记录: |