我使用FOSUserBundle来管理应用程序中的用户。但实际上,我有多个用户实体:ParticularConsumer.php
和ProfessionnalConsumer.php
。因此,我创建了一个ParentUser.php
实体,它作为抽象类,扩展了FOSUserBundle的BaseUser
。请参阅此处的代码:
/**
* ParentUser
*
* @ORM'Table(name="parent_users")
* @ORM'InheritanceType("JOINED")
* @ORM'DiscriminatorColumn(name="discr", type="string")
* @ORM'DiscriminatorMap({"particular_consumer" = "ParticularConsumer", "professionnal_consumer" = "ProfessionnalConsumer"})
* @ORM'Entity(repositoryClass="MyBundle'EntityBundle'Repository'ParentUserRepository")
*
*/
abstract class ParentUser extends BaseUser
{
/**
* @ORM'Id
* @ORM'Column(name="pusr_id", type="integer", nullable=false)
* @ORM'GeneratedValue(strategy="AUTO")
*/
protected $id;
public function __construct()
{
parent::__construct();
// your own logic
}
// ...
因此,还有另外两个实体扩展了Parentuser.php
,遵循条令行为和文档的类表继承:
第一个ParticularConsumer.php
/**
* ParticularConsumer
*
* @ORM'Table(name="particular_consumer")
* @ORM'Entity(repositoryClass="MyBundle'EntityBundle'Repository'ParticularConsumerRepository")
*
*/
class ParticularConsumer extends ParentUser
{
public function __construct()
{
parent::__construct();
// your own logic
}
}
第二个ProfessionnalConsumer.php
/**
* ProfessionnalConsumer
*
* @ORM'Table(name="professionnal_consumer")
* @ORM'Entity(repositoryClass="MyBundle'EntityBundle'Repository'ProfessionnalConsumerRepository")
*
*/
class ProfessionnalConsumer extends ParentUser
{
public function __construct()
{
parent::__construct();
// your own logic
}
}
现在,我想做的和知道的是如何持久化父实体和子实体。
事实上,当我使用FOSUserBundle时,所有路由(注册、登录等)都由该bundle管理和生成。现在我需要在子实体中持久化数据,通常它在父实体中保持数据,对吗?我该如何进行?
这就是我需要注册消费者的方式:
页面上有一个问题,whish询问用户是否有专业人员或细节。
这里有一个下拉列表供他们选择。
根据选择,我需要在正确的实体中注册用户。如果用户在下拉列表中选择特定,我需要加载/显示在ParticularConsumer.php
中而不仅仅在ParentUser.php
中持久化数据的窗体。
但当我使用FOSUSerBundle时,我真的不知道该如何进行。正如您所理解的,使用FOS是管理用户和管理安全的一种实用方法,我希望保留捆绑包的逻辑。我想利用好的做法
最后,按照FOSUserBundle的所有文档进行安装,如果我想注册用户(localhost/web/app_dev.php/register
),我会出现以下错误:
错误:无法实例化抽象类MyBundle''EntityBundle''Entity''ParentUser
如果ParentUser
是一个抽象类,那么它就不能是Entity
。在这种情况下,您必须将其设置为MappedSuperClass。但正如您在文档中所读到的:
映射超类不能是实体,它不可查询,并且映射超类定义的持久关系必须是单向的(仅具有拥有方)。这意味着一对多关联在映射的超类上根本不可能。此外,只有当映射的超类此时仅在一个实体中使用时,多对多关联才是可能的。为了进一步支持继承,必须使用单表或联接表继承特性。
如果您希望能够查询ParentUser
,并且希望此类拥有自己的实体存储库,则必须删除abstract
,并在@ORM'DiscriminatorMap
定义中添加ParentUser
的值:
@ORM'DiscriminatorMap({
"parent_user" = "ParentUser"
"particular_consumer" = "ParticularConsumer",
"professionnal_consumer" = "ProfessionnalConsumer"
})