我正在使用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
}
// ...
所以还有另外两个实体在{{3>} Doctrine 行为和文档之后扩展了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 时,所有路由(寄存器,登录等等)都由此捆绑包管理和生成。现在我需要在子实体中持久保存数据,通常它会在父实体中保留数据,这对吗?我该如何准确地进行?
我需要如何注册消费者:
页面上有一个问题,请问用户是否有 专业人士或详情。
这里有一个下拉列表供他们做出选择。
根据选择,我需要在正确的实体中注册用户。
如果用户在下拉列表中选择特定,我需要
加载/显示表单,以便在ParticularConsumer.php
中保留数据,而不仅仅是ParentUser.php
。
但是当我使用FOSUSerBundle时,我真的不知道如何准确地进行。您可以理解,使用 FOS 是一种实用的方法来管理用户和管理安全性,我想保留捆绑的逻辑。我想使用好的做法。
最后,按照 FOSUserBundle 的所有文档安装它,如果我想注册用户(localhost/web/app_dev.php/register
),我有这个错误:
错误:无法实例化抽象类MyBundle \ EntityBundle \ Entity \ ParentUser
答案 0 :(得分:1)
如果您的ParentUser
是抽象类,则它不能是Entity
。在这种情况下,您必须将其设为 MappedSuperClass 。但正如您可以在文档中看到的那样:
映射的超类不能是实体,它不是可查询的,并且由映射的超类定义的持久关系必须是单向的(仅具有拥有方)。这意味着根本不可能在映射的超类上进行一对多关联。此外,只有当映射的超类目前仅在一个实体中使用时,才能实现多对多关联。为了进一步支持继承,必须使用单个或连接表继承功能。
如果您希望能够查询ParentUser
并希望此类拥有自己的实体存储库,那么您必须删除abstract
并为ParentUser
添加值您的@ORM\DiscriminatorMap
定义:
@ORM\DiscriminatorMap({
"parent_user" = "ParentUser"
"particular_consumer" = "ParticularConsumer",
"professionnal_consumer" = "ProfessionnalConsumer"
})