4

我有一个案例,我需要跨多个应用程序(位于同一个项目中)重用常见的学说实体。这些应用程序仅仅是相应机构使用的信息系统的实例。

我已将所有实体和存储库隔离到单独的捆绑包中,到目前为止,这就像一个魅力。问题是:我收到了一个要求,即只有其中一些实例需要支持其他一些功能。修改将包括向某些实体添加新的属性/关系。

这是一个简短的例子:

我们有一所大学,它有许多教师单位(即实例)。信息系统的建立只支持学士课程,但一个月前我们收到了支持专业硕士课程的要求。他们想处理所有他们认为相同的应用程序实例。这仅适用于其中一些实例

问题:有没有办法“覆盖”受影响的实体,同时保持原始实体的功能?我可以完全覆盖实体配置(YAML 或注释,不重要)吗?我真的很想保留代码库而不是将所有实体/存储库复制到另一个包...

4

3 回答 3

5

您可以通过捕获事件来覆盖实体加载的类元数据。

事件监听器

<?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 }
于 2015-07-24T06:46:48.513 回答
2

Sympatch 提供工具来覆盖 Symfony2 项目的任何代码部分,包括实体,而不会破坏代码库。请参阅https://github.com/DHorchler/SympatchBundle

于 2013-03-17T21:16:17.257 回答
1

我不知道是什么意思。看起来这是可能的,但尚未记录。我不知道文档或代码是否正在进行中。

在本期中,stof 表示根本不可能。

我认为您应该为此使用 SCM 分支。

于 2012-10-13T11:46:08.730 回答