使用FOSUserBundle持久化父实体和子实体;加入”;类表继承原则2/Symfoy2.7


persist parent and child entities using FOSUserBundle and "JOINED" Class Table Inheritance Doctrine 2/Symfony2.7

我使用FOSUserBundle来管理应用程序中的用户。但实际上,我有多个用户实体:ParticularConsumer.phpProfessionnalConsumer.php。因此,我创建了一个ParentUser.php实体,它作为抽象类,扩展了FOSUserBundleBaseUser。请参阅此处的代码:

/**
 * 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"
})