使用FOSUserBundle和" JOINED"持久化父子实体类表继承Doctrine 2 / Symfony2.7

时间:2015-11-19 10:29:56

标签: php symfony inheritance doctrine-orm fosuserbundle

我正在使用FOSUserBundle来管理我的用户进入我的应用程序。 但事实上,我有多个用户实体:ParticularConsumer.phpProfessionnalConsumer.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

1 个答案:

答案 0 :(得分:1)

如果您的ParentUser是抽象类,则它不能是Entity。在这种情况下,您必须将其设为 MappedSuperClass 。但正如您可以在文档中看到的那样:

  

映射的超类不能是实体,它不是可查询的,并且由映射的超类定义的持久关系必须是单向的(仅具有拥有方)。这意味着根本不可能在映射的超类上进行一对多关联。此外,只有当映射的超类目前仅在一个实体中使用时,才能实现多对多关联。为了进一步支持继承,必须使用单个或连接表继承功能。

如果您希望能够查询ParentUser并希望此类拥有自己的实体存储库,那么您必须删除abstract并为ParentUser添加值您的@ORM\DiscriminatorMap定义:

@ORM\DiscriminatorMap({
    "parent_user" = "ParentUser"
    "particular_consumer" = "ParticularConsumer",
    "professionnal_consumer" = "ProfessionnalConsumer"
})