inheritance - 在 Symfony2 中创建具有可扩展实体的可移植包

标签 inheritance symfony doctrine-orm

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

一个例子可以是一个可重用的 UserBundle,它包含一个定义了所有 ORM 映射的 User 实体。然而,在我的应用程序中,我可能想要扩展此实体并添加额外的列、关联或覆盖某些父映射。

我能找到的最接近的解决方案是 Doctrine2 的映射父类(super class),但是我会失去可重用包的即插即用性,即使我不想修改,我也总是必须在我的应用程序中扩展映射父类(super class)映射。

其他记录在案的继承方案需要修改父级的映射,然后我的 UserBundle 就不能再跨项目移植了。

有没有办法在一个包中定义一个完全工作的实体,并且仍然在另一个包中扩展它?

最佳答案

为了将来引用,这可以使用 target entity resolution 来解决。 .

您可以在 Symfony docs 中找到更多信息.

步骤非常简单:

  • 在您的包中为 User 创建一个接口(interface)实体
    namespace Acme/UserBundle/Model;
    interface UserInterface
    {
        // public functions expected for entity User
    }
    
  • 建立你的基地User实体实现接口(interface)
    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
    

  • 如果要定制User当前应用程序的实体
  • User 扩展类或实现UserInterface
    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
    
  • 关于inheritance - 在 Symfony2 中创建具有可扩展实体的可移植包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9801173/

    相关文章:

    symfony - 在 Doctrine 迁移中禁用外键

    php - 在 oneToMany 关系中创建和删除子项的正确 DDD 方法?

    Java继承困惑,父类(super class)和子类成员变量同名

    node.js - Sequelize 模型中的继承

    testing - symfony WebTestCase 客户端不发送发布数据

    forms - symfony 2 表单类型集合,为模型中的每个新属性更改标签

    php - Symfony2 : How to modify the current user's entity using a form?

    java继承问题-必须在父类中创建空构造函数

    c++ - 将初始化列表与从空基类继承的结构一起使用

    Symfony Profiler 查询堆栈跟踪