3

我正在开始一个新项目,它将充当授权/身份验证服务器和特定类型用户的简单用户管理。用户可以是HelpDeskResponsibleGroupManagerEmployeeCustomer。所有这些组成员都可以在 Web 界面上使用相同的表单登录。每个模型将包含描述它们的不同数据集。

我的问题是模型设计。我很确定我需要一些User具有登录和读取角色所需的所有数据的实体,但我不知道如何将其余模型与用户帐户相关联以轻松获取有关登录用户的信息。另一个问题是用户管理 - 给定用户帐户已创建,我需要以某种方式将其链接到我上面提到的一种类型的模型。

我的概念是过度设计吗?有没有针对此类问题的解决方案?也许我不需要针对不同帐户类型的多个实体?

感谢您的任何建议。

编辑:不同的权限级别不是这里最大的问题 - 我想根据用户所属的角色存储有关用户的不同信息。Customer将具有与 不同的数据集Employee。我很确定它们是不同的模型,但我想保存使用相同登录表单登录的能力。

4

2 回答 2

3

我认为主要问题是您的耦合倒退了:在您的情况下,用户管理上下文将必须了解其他有界上下文(BC)的细节,而它应该是相反的。否则,随着更多系统的使用,您将发现自己必须不断修改用户管理上下文。

例如,该HelpDeskResponsible角色很可能在服务台系统中发挥作用,该系统位于它自己的 BC(或一组 BC)中。正是该上下文应该负责建模和持久化HelpDeskResponsible. 用户管理上下文应该保存的唯一内容是用户是否具有特定角色,以及可能对所有用户通用的某些信息(例如名字、姓氏)。

在此处输入图像描述

显然,上图忽略了位于帮助台 BC 中的反腐败层(例如服务HelpDeskUserService),它负责抽象出与用户管理 BC 的耦合并转换UserHelpDeskResponsible.

于 2017-04-01T15:57:26.213 回答
0

由于您的附加实体使用其他附加数据扩展User实体,我可能会使用Class Table Inheritance

类表继承是一种继承映射策略,其中层次结构中的每个类都映射到多个表:它自己的表和所有父类的表。子类的表通过外键约束链接到父类的表。Doctrine 2 通过在层次结构的最顶层表中使用鉴别器列来实现此策略,因为这是使用类表继承实现多态查询的最简单方法。

这样,您将拥有一个User包含基本数据(用户名、密码、电子邮件等)的基表,然后是每个附加实体的另一个表,该表扩展User了附加数据(例如salarytable 上的列Employee)。


定义父实体

在这里,我们告诉 Doctrine 这User是我们的基类。然后 Doctrine 使用一个鉴别器列来识别您的用户属于哪个实体。当然,您需要映射所有要扩展的实体User(这里我只添加Employee)。

/**
 * @ORM\Entity(repositoryClass="AppBundle\Repository\UserRepository")
 * @ORM\Table(name="user")
 * @ORM\InheritanceType("JOINED")
 * @ORM\DiscriminatorColumn(name="discr", type="string")
 * @ORM\DiscriminatorMap({"user" = "User", "employee" = "Employee"})
 */
class User {
    // your class..
}

定义子实体

/**
 * @ORM\Entity(repositoryClass="AppBundle\Repository\EmployeeRepository")
 * @ORM\Table(name="employee")
 */
class Employee extends User {

    /**
     * @ORM\Column(name="salary", type="float")
     */
    private $salary;

    public function setSalary($salary)
    {
        $this->salary = $salary;
        return $this;
    }

    public function getSalary()
    {
        return $this->salary;
    }

}

当然Employee类可以覆盖父方法(例如getRoles(),如果你实现UserInterfaceinto User)。

最后(备份您的数据库并)使用php bin/console doctrine:schema:update --force. idDoctrine 将使用定义的数据和一个引用 relative的列创建新表User

因此,当普通用户登录时,Symfony 将加载User实体,而当员工登录时,它将加载Employee实体。

于 2017-04-01T17:02:36.503 回答