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

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (1)
  • 关注 (0)
  • 查看 (9)

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

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

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

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

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

提问于
用户回答回答于

为了将来的参考,这可以使用目标实体分辨率来解决。

你可以在Symfony文档中找到更多信息。

步骤非常直接:

  1. User实体的包中创建一个接口 namespace Acme/UserBundle/Model; interface UserInterface { // public functions expected for entity User }
  2. 让你的基础User实体实现接口 namespace Acme/UserBundle/Entity; /** * @ORM\Entity */ class User implements UserInterface { // implement public functions }
  3. 照常创建关系,但使用界面 namespace Acme/InvoiceBundle/Entity; /** * @ORM\Entity */ class Invoice { /** * @ORM\ManyToOne(targetEntity="Acme\UserBundle\Model\UserInterface") */ protected $user; }
  4. 通过将以下内容添加到config.yml来配置侦听器 doctrine: # .... orm: # .... resolve_target_entities: Acme\UserBundle\Model\UserInterface: Acme\UserBundle\Entity\User

如果你想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 }
  2. 相应地配置侦听器 doctrine: # .... orm: # .... resolve_target_entities: Acme\UserBundle\Model\UserInterface: Acme\WebBundle\Entity\User

扫码关注云+社区