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