Конфигурация сущности Symfony 2 + Doctrine 2

У меня есть случай, когда мне нужно повторно использовать общие понятия доктрины в нескольких приложениях (которые находятся внутри одного и того же проекта). Эти приложения являются лишь примерами информационной системы, используемой соответствующими учреждениями.

Я изолировал все сущности и репозитории в отдельный пакет, и до сих пор он работал как прелесть. Вот улов: я получил требование, чтобы только некоторые из этих экземпляров нуждались в поддержке некоторых других функций. Модификация включала бы добавление новых атрибутов / отношений к некоторым объектам.

Вот краткий пример:

У нас есть университет, в котором есть несколько факультетов (например, экземпляры). Информационная система была построена для поддержки только программы обучения бакалавров, но месяц назад мы получили требование о поддержке специализации и мастер- исследований. Они хотят, чтобы все они считали одним и тем же экземпляром приложения. Это относится только к некоторым из этих случаев .

Вопрос: Есть ли способ «переопределить» затронутые объекты при сохранении функциональности исходных? Могу ли я переопределить конфигурацию сущности (YAML или аннотацию, а не важно)? Мне бы очень хотелось сохранить базу кода и не копировать все сущности / репозитории в другой пакет …

Я не знаю, что это значит. Похоже, это возможно, но пока не задокументировано. У меня нет документации или кода.

В этом вопросе stof предполагает, что это невозможно вообще.

Я думаю, для этого вам следует использовать ветви SCM.

Вы можете переопределить метаданные классов при загрузке объектов, поймав событие.

EventListener

 <?php namespace Lol\RandomBundle\EventListener; use Doctrine\ORM\Event\LoadClassMetadataEventArgs; class ClassMetadataListener { /** * Run when Doctrine ORM metadata is loaded. * * @param LoadClassMetadataEventArgs $eventArgs */ public function loadClassMetadata(LoadClassMetadataEventArgs $eventArgs) { $classMetadata = $eventArgs->getClassMetadata(); // Override User class to flag MappedSuperclass. if ('AnotherLol\AnotherRandomBundle\Entity\User' === $classMetadata->name) { // Do whatever you want... $classMetadata->isMappedSuperclass = true; } } } 

Конфигурация служб

 services: lol.random.listener.class_metadata: class: Lol\RandomBundle\EventListener\ClassMetadataListener tags: - { name: doctrine.event_listener, event: loadClassMetadata } 

Sympatch предоставляет инструменты для переопределения любой части кода вашего проекта Symfony2, включая сущности, без разрушения базы кода. См. https://github.com/DHorchler/SympatchBundle .