Symfony 2 + Doctrine 2覆盖实体配置

4
我有一个案例需要将一些通用的教条实体在多个应用程序之间重用(它们驻留在同一个项目中)。这些应用程序仅是相应机构使用的信息系统实例。
我已经将所有实体和仓库隔离到单独的捆绑包中,并且到目前为止效果很好。但是,现在有一个要求,只有其中一些实例需要支持其他一些功能。修改将包括向某些实体添加新属性/关系。
以下是简要示例:
我们有一所大学,拥有许多教学单位(即实例)。信息系统是建立来支持仅bachelor学习计划的,但一个月前我们收到了支持specializationmaster学习计划的需求。他们想通过同一个应用程序实例来处理所有这些内容。这仅适用于其中一些实例。
问题是:有没有办法“覆盖”受影响的实体同时保留原始实体的功能?我能否完全覆盖实体配置(YAML或注释无关紧要)?我真的很想保留代码库,而不是将所有实体/存储库复制到另一个包中...
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 }

鉴于这个问题已经存在将近3年,团队的决定也已经有将近2年的时间了,这只对一些未来的项目有用。但还是感谢您提出这个想法 :) - Jovan Perovic
1
我希望有类似问题的人能够发现这个解决方案有用。 - Aistis

2

1

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

在这个问题中,stof 表示根本不可能。

我认为你应该使用 SCM 分支来实现这个。


太糟糕了 :( 看起来它真的不会得到支持 :-/ - Jovan Perovic
除此之外,似乎映射的超类是我可以扩展模型的最接近的方法。但是仍然存在许多限制... - Jovan Perovic
使用SCM分支是一种选择,但我的原始想法是将所有代码放在“master”分支中。以某种方式,这样管理所有代码似乎更容易。由于我在帖子中提到的要求是通过复制/粘贴代码解决的(我知道,非常不好),所以我期待着我们将在一个月左右进行的重构阶段,届时我会向您建议新的想法 :) 我会等待一两天以获取更多潜在的建议,但就目前而言,积分归您;) - Jovan Perovic
我知道这是很久以前的事了,但我只是想再次感谢你指引我正确的方向。我们开始了整个应用程序的重构,正如你建议的那样,SCM分支确实非常整洁 :) - Jovan Perovic

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接