【问题标题】:Symfony 2 + Doctrine 2 overriding entity configurationSymfony 2 + Doctrine 2 覆盖实体配置
【发布时间】:2012-10-13 11:09:51
【问题描述】:

我有一个案例,我需要在多个应用程序(驻留在同一个项目中)之间重用通用学说实体。这些应用程序仅仅是相应机构使用的信息系统的实例。

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

这是一个简短的例子:

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

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

【问题讨论】:

    标签: php symfony doctrine-orm


    【解决方案1】:

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

    事件监听器

    <?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 年了,这只能对一些未来的项目有用。但是谢谢你的想法:)
    • 我希望有类似问题的人会发现这个解决方案很有用。
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

      In this issue, stof 认为根本不可能。

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

      【讨论】:

      • 那太糟糕了 :( 好像真的不支持了 :-/
      • 除此之外,映射的超类似乎是我最接近扩展模型的方法。这仍然有许多限制......
      • 使用 SCM 分支是一种选择,但我最初的想法是将所有代码放在 master 分支中。不知何故,以这种方式管理所有代码似乎更容易。由于我在帖子中提到的要求是通过复制/粘贴代码解决的(我知道,大怪人不)我期待着我们将在一个月左右的重构阶段,届时我会建议你的想法:) 我会等待一两天以获得更多潜在建议,但就目前而言,积分归你;)
      • 我知道那是很久以前的事了,但我只是想再次感谢您为我指明了正确的方向。我们开始了对应用程序和 SCM 分支的全新重构,正如您所建议的那样,事实证明确实非常整洁 :)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-06-05
      • 2014-09-30
      • 2013-06-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-12
      相关资源
      最近更新 更多