Добавить установщик инъекций в существующий сервис - PullRequest
0 голосов
/ 24 ноября 2011

Я хочу добавить установщик впрыска в существующую службу. Базовый сервис определяется следующим образом:

[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

Как я могу изменить / переопределить эту конфигурацию службы, чтобы добавить свой собственный метод установки в мой собственный файл services.yml?

1 Ответ

1 голос
/ 24 ноября 2011

Что бы я сделал, это использовал класс расширения в вашем пространстве имен 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 и семантическую конфигурацию для выполнения более сложных задач.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...