Ger*_*rry 19 inheritance symfony doctrine-orm
我想创建一些可以在不同项目中重用的Symfony2软件包,但是如果需要的话,实体也可以轻松扩展.
一个示例可以是可重用的UserBundle,其中包含定义了所有ORM映射的User实体.但是,在我的应用程序中,我可能希望扩展此实体并添加额外的列,关联或覆盖一些父级的映射.
我能找到的最接近的解决方案是Doctrine2映射的超类,但是后来我失去了可重用bundle的即插即用功能,即使我不想修改,我总是要在我的应用程序中扩展映射的超类.映射.
其他记录的继承方案需要修改父级的映射,然后我的UserBundle将不再可移植到项目中.
有没有办法在一个包中定义一个完全工作的实体,并仍然在另一个包中扩展它?
xPh*_*eRe 11
为了将来参考,可以使用目标实体解析来解决这个问题.
您可以在Symfony文档中找到更多信息.
这些步骤非常简单:
在User实体的捆绑中创建一个接口
namespace Acme/UserBundle/Model;
interface UserInterface
{
// public functions expected for entity User
}
Run Code Online (Sandbox Code Playgroud)使您的基础User实体实现接口
namespace Acme/UserBundle/Entity;
/**
* @ORM\Entity
*/
class User implements UserInterface
{
// implement public functions
}
Run Code Online (Sandbox Code Playgroud)像往常一样创建关系,但使用界面
namespace Acme/InvoiceBundle/Entity;
/**
* @ORM\Entity
*/
class Invoice
{
/**
* @ORM\ManyToOne(targetEntity="Acme\UserBundle\Model\UserInterface")
*/
protected $user;
}
Run Code Online (Sandbox Code Playgroud)通过将以下内容添加到config.yml来配置侦听器
doctrine:
# ....
orm:
# ....
resolve_target_entities:
Acme\UserBundle\Model\UserInterface: Acme\UserBundle\Entity\User
Run Code Online (Sandbox Code Playgroud)如果要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
}
Run Code Online (Sandbox Code Playgroud)相应地配置监听器
doctrine:
# ....
orm:
# ....
resolve_target_entities:
Acme\UserBundle\Model\UserInterface: Acme\WebBundle\Entity\User
Run Code Online (Sandbox Code Playgroud)| 归档时间: |
|
| 查看次数: |
2958 次 |
| 最近记录: |