symfony2条令捆绑实体覆盖/替换


symfony2 doctrine bundle entity override / replacing

我遇到了特定于Doctrine ORM实体映射和从EkinoWordpressBundle覆盖供应商实体的问题。我知道有一些功能可以覆盖捆绑包中的默认捆绑包实体。当我运行条令:schema:update时,我得到SchemaException,比如"名为wp_users的表"已经存在。我试图弄清楚如何从捆绑包中忽略实体的默认原则映射,以避免这个问题。

到目前为止,我所做的是:

  1. 创建实体以替换捆绑包中的User和UserMeta
  2. 我在config.yml中定义了ekino.wordpress.entity.user.class:MyBundleNamespace''user和ekino.wwordpress.entiity.user_meta.class:MyBundleNamespace''UserMeta
  3. 我正在使用doctrie.org.resolve_target_entities将对Ekino''WordpressBundle''Entity''User和Ekino''WordpressBundle''Entity''UserMeta的关联引用替换为我自己的关联引用

我不清楚如何定义自定义实体管理器,以及这将如何帮助缓解捆绑包开发人员提出的问题https://github.com/ekino/EkinoWordpressBundle/issues/71

此外,我正在使用基于yml的映射定义,以防对可能的解决方案产生影响。

Doctrine似乎仍然认为Ekino"用户"仍然是一个实体,而不是专门使用您的实体。我不熟悉埃基诺。如果它使用基于Annotation的配置,您可能需要创建自己的AnnotationDriver子类,并让它过滤掉您不想要的Ekino类。

实际上,在ClassMetadata的较低级别代码中玩是很有趣的,但这样做会自担风险。

我得到了一个朋友的帮助,他帮助我理解了维护人员建议的解决方案最初要求我做什么。

因此,在我的配置yml中,我有以下用于我的条令配置

    doctrine:
        orm:
            ...
            entity_managers:
                default:
                    mappings:
                        MyCustomAppBundle: ~
                wordpress:
                    mappings:
                        EkinoWordpressBundle: ~

这解决了部分问题。我没有得到关于已经存在的表的原始SchemaExceptions。由于我只替换了捆绑包中的两个实体,其中一些关联已不在原始实体的ClassMetadata中,因此我收到了关于丢失实体的额外错误,通过将以下内容添加到doctrine:orm:配置定义中解决了这些错误:

resolve_target_entities:
        Ekino'WordpressBundle'Entity'User: App'Bundle'MyCustomAppBundle'Entity'User
        Ekino'WordpressBundle'Entity'UserMeta: App'Bundle'MyCustomAppBundle'Entity'UserMeta

由于必须定义单独的实体经理,我最终失去了原则的自动映射,但我认为这是一个不错的折衷方案。