【问题标题】:persist parent and child entities using FOSUserBundle and "JOINED" Class Table Inheritance Doctrine 2/Symfony2.7使用 FOSUserBundle 和“JOINED”类表继承原则 2/Symfony2.7 持久化父实体和子实体
【发布时间】:2015-11-19 10:29:56
【问题描述】:

我使用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,遵循Doctrine 行为和文档的Class Table Inheritance

第一个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 时,所有路由(注册、登录等)都由这个包管理和生成。现在我需要将数据保存在子实体中,通常它会将数据保存在父实体中,对吗?我该如何进行?


我需要这样注册消费者:

页面上有一个问题,询问用户是否有 专业人士或细节。

这里有一个下拉列表供他们选择。

选择后,我需要在正确的实体中注册用户。 如果用户在下拉列表中选择 particular,我需要 加载/显示一个将数据保存在ParticularConsumer.php 而不仅仅是ParentUser.php 中的表单。

但是当我使用 FOSUSerBundle 时,我真的不知道如何进行。正如您所理解的,使用 FOS 是一种实用的方式来管理用户和管理安全性,我想保留捆绑的逻辑。我想使用良好的做法。

最后,按照 FOSUserBundle 的所有文档来安装它,如果我想注册一个用户 (localhost/web/app_dev.php/register) 我有这个错误:

错误:无法实例化抽象类 MyBundle\EntityBundle\Entity\ParentUser

【问题讨论】:

    标签: php symfony inheritance doctrine-orm fosuserbundle


    【解决方案1】:

    如果您的ParentUser 是一个抽象类,那么它不能是Entity。在这种情况下,您必须将其发送到 MappedSuperClass。但正如您在文档中看到的那样:

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

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

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

    【讨论】:

    • 我现在明白ParentUser.php 需要并且必须成为其他用户类(ParticularConsumer.phpProfessionnalConsumer.php)的基础。但正如您所理解的,我需要将 FOSUserBundle 逻辑(注册、配置文件、连接)扩展到子实体。我该怎么做呢?
    • 就像我说的那样,要完成这项工作,您应该将 ParentUser 设置为实体或 MappedSuperClass。为什么ProfessionnalConsumerParticularConsumer不直接扩展BaseUser
    • 我不知道 FOSUserBundle 是否可以在许多实体上扩展,我还没有尝试过?有可能吗?
    • @french_dev 是一个抽象类。如果不可能,我会感到惊讶。但我没有第一手经验......
    • 感谢您的帮助,当然它是一个抽象类,我将尝试编写我需要的代码来扩展 FOS 两次。
    猜你喜欢
    • 1970-01-01
    • 2015-11-15
    • 1970-01-01
    • 2011-08-21
    • 1970-01-01
    • 2015-04-15
    • 1970-01-01
    • 2016-05-17
    • 1970-01-01
    相关资源
    最近更新 更多