在Symfony2中使用可扩展实体创建可移植Bundles

Ger*_*rry 19 inheritance symfony doctrine-orm

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

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

我能找到的最接近的解决方案是Doctrine2映射的超类,但是后来我失去了可重用bundle的即插即用功能,即使我不想修改,我总是要在我的应用程序中扩展映射的超类.映射.

其他记录的继承方案需要修改父级的映射,然后我的UserBundle将不再可移植到项目中.

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

xPh*_*eRe 11

为了将来参考,可以使用目标实体解析来解决这个问题.

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

这些步骤非常简单:

  1. User实体的捆绑中创建一个接口

    namespace Acme/UserBundle/Model;
    interface UserInterface
    {
        // public functions expected for entity User
    }
    
    Run Code Online (Sandbox Code Playgroud)
  2. 使您的基础User实体实现接口

    namespace Acme/UserBundle/Entity;
    /**
     * @ORM\Entity
     */
    class User implements UserInterface
    {
        // implement public functions
    }
    
    Run Code Online (Sandbox Code Playgroud)
  3. 像往常一样创建关系,但使用界面

    namespace Acme/InvoiceBundle/Entity;
    /**
     * @ORM\Entity
     */
    class Invoice
    {
        /**
         * @ORM\ManyToOne(targetEntity="Acme\UserBundle\Model\UserInterface")
         */
        protected $user;
    }
    
    Run Code Online (Sandbox Code Playgroud)
  4. 通过将以下内容添加到config.yml来配置侦听器

    doctrine:
        # ....
        orm:
            # ....
            resolve_target_entities:
                Acme\UserBundle\Model\UserInterface: Acme\UserBundle\Entity\User
    
    Run Code Online (Sandbox Code Playgroud)

如果要User为当前应用程序自定义实体

  1. User类或实现扩展UserInterface

    namespace Acme/WebBundle/Entity;
    use Acme/UserBundle/Entity/User as BaseUser;
    /**
     * @ORM\Entity
     */
    class User extends BaseUser
    {
        // Add new fields and functions
    }
    
    Run Code Online (Sandbox Code Playgroud)
  2. 相应地配置监听器

    doctrine:
        # ....
        orm:
            # ....
            resolve_target_entities:
                Acme\UserBundle\Model\UserInterface: Acme\WebBundle\Entity\User
    
    Run Code Online (Sandbox Code Playgroud)