我有一个案例,我需要在多个应用程序(位于同一个项目中)重用常见的学说实体。这些应用程序仅仅是相应机构使用的信息系统的实例。
我已将所有实体和存储库隔离到单独的包中,到目前为止它就像一个魅力。 以下是捕获:我收到的要求是,只有部分实例需要支持其他一些功能。修改包括向某些实体添加新的归属/关系。
这是一个简短的例子:
我们有一所大学,拥有多个教师单位(实例,即)。建立信息系统仅支持学士学习计划,但一个月前我们也收到了支持专业化和硕士学习的要求。他们希望处理所有他们认为相同的应用程序实例。 这仅适用于其中一些。
问题:有什么方法可以“覆盖”受影响的实体,同时保留原始功能的功能?我可以覆盖实体配置(YAML或注释,不重要)吗?我真的想保留代码库,而不是将所有实体/存储库复制到另一个包......
答案 0 :(得分:4)
您可以通过捕获事件来覆盖加载实体的类元数据。
<?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 }
答案 1 :(得分:2)
Sympatch提供的工具可以覆盖Symfony2项目的任何代码部分,包括实体,而不会破坏代码库。请参阅https://github.com/DHorchler/SympatchBundle。
答案 2 :(得分:1)