2011-11-24 57 views
0

我想將setter注入添加到現有服務。基礎服務定義如下:將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文件中使用我自己的類裏面加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 

如何修改/覆蓋此服務配置,以添加自己的setter注入在自己services.yml文件?

回答

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邏輯和語義配置來執行更高級的任務。