我想在现有服务中添加setter注入。基本服务定义如下:
[container] Information for service doctrine.orm.default_entity_manager
Service Id doctrine.orm.default_entity_manager
Class Doctrine\ORM\EntityManager
Tags -
Scope container
Public yes
我已经覆盖了config.yml
文件中服务的class参数,以使用我自己的类,它将setExample()
方法添加到基类。服务定义现在看起来像:
[container] Information for service doctrine.orm.default_entity_manager
Service Id doctrine.orm.default_entity_manager
Class MyCustom\EntityManager
Tags -
Scope container
Public yes
如何修改/覆盖此服务配置以在我自己的services.yml
文件中添加自己的setter注入?
答案 0 :(得分:1)
我要做的是在捆绑DependencyInjection命名空间中使用扩展类。它应该是这样的:
<?php
namespace YourNamespace\YourBundle\DependencyInjection;
use Symfony\Component\DependencyInjection\ContainerBuilder;
use Symfony\Component\Config\FileLocator;
use Symfony\Component\HttpKernel\DependencyInjection\Extension;
use Symfony\Component\DependencyInjection\Loader;
use Symfony\Component\DependencyInjection\Definition;
/**
* Provide a DIC extension to support configurable cheeta subscription adapters.
*/
class YourNamespaceYourBundleExtension extends Extension
{
/**
* {@inheritDoc}
*/
public function load( array $configs, ContainerBuilder $container )
{
// Some stuff with configuration...
$configuration = new Configuration();
$config = $this->processConfiguration( $configuration, $configs );
// Load service configuration
$loader = new Loader\XmlFileLoader( $container, new FileLocator(__DIR__.'/../Resources/config' ) );
$loader->load( 'services.xml' );
$container->findDefinition('doctrine.orm.default_entity_manager')->addMethodCall('setExample', array(/* Eventual parameters */));
}
}
可能还有一种方法可以使用服务继承来做同样的事情,但我从未尝试过。但是在Extension类中,您可以执行与service.xml文件相同的操作,并使用php逻辑和语义配置来执行更高级的操作。