Inheritance 在Symfony2中创建具有可扩展实体的可移植捆绑包

Inheritance 在Symfony2中创建具有可扩展实体的可移植捆绑包,inheritance,symfony,doctrine-orm,Inheritance,Symfony,Doctrine Orm,我想创建一些Symfony2捆绑包,这些捆绑包可以在不同的项目中重用,但如果需要,也可以轻松扩展实体 例如,一个可重用的UserBundle,它包含一个定义了所有ORM映射的用户实体。但是,在我的应用程序中,我可能希望扩展此实体并添加额外的列、关联或覆盖父级的某些映射 我能找到的最接近的解决方案是Doctrine2的映射超类,但这样我就失去了可重用包的插件性和可玩性,即使我不想修改映射,我也必须在应用程序中扩展映射超类 其他有文档记录的继承方案需要修改父级的映射,这样我的UserBundle就不

我想创建一些Symfony2捆绑包,这些捆绑包可以在不同的项目中重用,但如果需要,也可以轻松扩展实体

例如,一个可重用的UserBundle,它包含一个定义了所有ORM映射的用户实体。但是,在我的应用程序中,我可能希望扩展此实体并添加额外的列、关联或覆盖父级的某些映射

我能找到的最接近的解决方案是Doctrine2的映射超类,但这样我就失去了可重用包的插件性和可玩性,即使我不想修改映射,我也必须在应用程序中扩展映射超类

其他有文档记录的继承方案需要修改父级的映射,这样我的UserBundle就不能在跨项目中移植了


是否有一种方法可以在一个包中定义一个完全工作的实体,并在另一个包中扩展该实体?

为了将来的参考,可以使用解决方法

您可以在中找到更多信息

步骤非常简单:

  • 在捆绑包中为
    用户
    实体创建一个接口

    namespace Acme/UserBundle/Model;
    interface UserInterface
    {
        // public functions expected for entity User
    }
    
  • 让您的基本
    用户
    实体实现该界面

    namespace Acme/UserBundle/Entity;
    /**
     * @ORM\Entity
     */
    class User implements UserInterface
    {
        // implement public functions
    }
    
    namespace Acme/InvoiceBundle/Entity;
    /**
     * @ORM\Entity
     */
    class Invoice
    {
        /**
         * @ORM\ManyToOne(targetEntity="Acme\UserBundle\Model\UserInterface")
         */
        protected $user;
    }
    
  • 像往常一样创建关系,但使用接口

    namespace Acme/UserBundle/Entity;
    /**
     * @ORM\Entity
     */
    class User implements UserInterface
    {
        // implement public functions
    }
    
    namespace Acme/InvoiceBundle/Entity;
    /**
     * @ORM\Entity
     */
    class Invoice
    {
        /**
         * @ORM\ManyToOne(targetEntity="Acme\UserBundle\Model\UserInterface")
         */
        protected $user;
    }
    
  • 通过将以下内容添加到config.yml来配置侦听器

    doctrine:
        # ....
        orm:
            # ....
            resolve_target_entities:
                Acme\UserBundle\Model\UserInterface: Acme\UserBundle\Entity\User
    
  • 如果要为当前应用程序自定义
    用户
    实体

  • 用户
    类扩展或实现
    用户界面

    namespace Acme/WebBundle/Entity;
    use Acme/UserBundle/Entity/User as BaseUser;
    /**
     * @ORM\Entity
     */
    class User extends BaseUser
    {
        // Add new fields and functions
    }
    
  • 相应地配置侦听器

    doctrine:
        # ....
        orm:
            # ....
            resolve_target_entities:
                Acme\UserBundle\Model\UserInterface: Acme\WebBundle\Entity\User
    

  • +1我和你得出了相同的结论,你有没有提出过解决方案?没有,目前的继承模式在理论上似乎是不可能的。关于这个问题有什么消息吗?我已经多次与这个限制作斗争,我想知道是否会发布一个真正的修复程序。仅仅为了在实体映射中添加一个字段而分叉束已经过时了。