Как расширить службу Doctrine в Symfony2?

Я хотел бы добавить несколько методов в службу Doctrine в Symfony2. Как я могу это сделать? Должен ли я расширить какой-то класс и зарегистрировать его как службу? Я бы предпочел, чтобы сервис оставался под названием «доктрина».


person Dawid Ohia    schedule 10.03.2012    source источник


Ответы (2)


Вы должны расширить класс Symfony\Bundle\DoctrineBundle\Registry и добавить собственные методы.

Затем все, что вам нужно сделать, это определить службу, например, в app/config/config.yml, которая называется «doctrine»:

// app/config/config.yml
services:
    doctrine:
        class: MyDoctrineRegistry
        arguments: [ @service_container ]

Службы, определенные в config.yml, будут загружены последними, поэтому они переопределяют службы по умолчанию.

Если вы хотите быть более чистым, вам нужно переопределить службу в DependencyInjection/Extension, используя:

$container->setAlias('doctrine', 'my_doctrine'); // my_doctrine is the name of you custom doctrine service

В этом последнем случае вы должны убедиться, что ваш пакет загружается ПОСЛЕ основных пакетов.

person Florian Klein    schedule 10.03.2012
comment
Когда я пробую вышеуказанное решение, я получаю эту ошибку ErrorException: Catchable Fatal Error: аргумент 1, переданный в Symfony\Bundle\DoctrineBundle\Registry::__construct(), должен реализовать интерфейс Symfony\Component\DependencyInjection\ContainerInterface, ни один не указан. Это потому, что класс реестра требует несколько аргументов. Есть идеи, как с этим бороться? - person Dawid Ohia; 12.03.2012
comment
да, ваше определение службы должно предоставлять аргументы вашему конструктору, здесь это должна быть служба service_container. Смотрите обновленный пост. - person Florian Klein; 13.03.2012
comment
Конструктор класса реестра имеет 5 обязательных аргументов: __construct(ContainerInterface $container, массив $connections, массив $entityManagers, $defaultConnection, $defaultEntityManager) - person Dawid Ohia; 13.03.2012
comment
У меня есть и другие аргументы: - person Dawid Ohia; 14.03.2012
comment
Я слышал о ключе parent, который делает вашу службу наследуемой от родительского определения. вы можете попробовать заменить arguments на parent: doctrine - person Florian Klein; 16.03.2012

Вы можете указать класс-оболочку для соединения и указать в нем пользовательские методы. Я использовал это раньше, чтобы расширить функциональность Doctrine DBAL, и это сработало очень хорошо для моего варианта использования.

Подробности здесь:

https://stackoverflow.com/a/8242438/312962

person Darragh Enright    schedule 10.03.2012
comment
В этом случае не понадобится, но я воспользуюсь этим решением для решения какой-нибудь другой проблемы, спасибо. - person Dawid Ohia; 11.03.2012