我有一个案例,需要在多个应用程序(位于同一项目中)中重用通用原则实体。这些应用程序只是相应机构使用的信息系统的实例。
我已经将所有实体和存储库隔离到单独的捆绑包中,到目前为止,这就像一个魅力问题是:我收到一个要求,即只有其中一些实例需要支持其他一些功能。修改将包括为一些实体添加新的属性/关系。
下面是一个简单的例子:
我们有一所大学,它有许多教师单位(例如)。信息系统的建立仅支持学士学位学习项目,但一个月前,我们收到了支持Specialized和master课程的要求。他们想处理所有他们认为相同的应用程序实例这仅适用于其中一些实例。
问题:是否有任何方法可以"覆盖"受影响的实体,同时保留原始实体的功能?我可以覆盖实体配置(YAML或注释,不重要)吗?我真的很想保留代码库,而不是将所有实体/存储库复制到另一个包。。。
您可以通过捕获事件来覆盖实体加载上的类元数据。
EventListener
<?php
namespace LolRandomBundleEventListener;
use DoctrineORMEventLoadClassMetadataEventArgs;
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 ('AnotherLolAnotherRandomBundleEntityUser' === $classMetadata->name) {
// Do whatever you want...
$classMetadata->isMappedSuperclass = true;
}
}
}
服务配置
services:
lol.random.listener.class_metadata:
class: LolRandomBundleEventListenerClassMetadataListener
tags:
- { name: doctrine.event_listener, event: loadClassMetadata }
Sympatch提供了覆盖Symfony2项目的任何代码部分(包括实体)的工具,而不会破坏代码库。看见https://github.com/DHorchler/SympatchBundle.
我不知道这意味着什么。看起来这是可能的,但还没有记录。我不知道文档或代码是否正在进行中。
在这个问题上,斯托夫认为这根本不可能。
我认为您应该使用SCM分支。