gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 12:59:14 25 4
gpt4 key购买 nike

我想创建一些可在不同项目中重复使用的 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/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com