FOSUserBundle,用户(角色)和组(角色)之间的关系?

时间:2015-03-16 09:33:48

标签: php symfony fosuserbundle

我对FOSUserBundle中的角色感到有点困惑。用户实体还具有角色列,通过该列我们可以为用户分配多个角色。根据{{​​3}}发布的答案,我们不需要单独的实体或表来管理用户角色。

我还实现了FOSUserBundle组,它还包含一组角色,可以将用户分配给这些角色。所以,我在这里理解的是,我们可以创建一个组来分配一组角色,以便可以使用组访问类似的角色。

现在,我遇到的问题是,如果可以单独从用户实体管理角色组,或者如何合并用户实体和组实体中的角色或我在这里缺少的内容,那么使用组的目的是什么?

1 个答案:

答案 0 :(得分:3)

  

:如果可以仅从用户实体管理一组角色,那么使用组的目的是什么

答案:答案可以从Using Groups With FOSUserBundle中提取:

  

Symfony2支持角色继承,因此从组继承角色是   并不总是需要。如果角色继承足以供您使用   例如,最好使用它而不是组,因为它更有效   (加载组会触发数据库)。


:如果您问自己:什么是角色组?何时需要使用角色组? < / p>

A :实质上是&#34; Group&#34;包含一组角色,按共同特征分类(类似于电子商务的类别)。例如,具有ROLE_ADMIN共同角色的控制面板应用程序的用户可能属于MANAGER组,而其他用户属于REVISER(这取决于您的需要) 。将用户角色分类为组可以更轻松地控制大量用户对特定工具或服务的访问。因此,使用或不使用角色组完全取决于您希望对应用程序执行的操作以及用户可以使用的交互数量。


  

:如何合并用户实体和群组实体或的角色   我在这里缺少什么?

A :如果角色继承不够并且您想要使用&#34; groups&#34;,则需要在User - &gt;之间创建关联。组 - &gt;像这个实现示例的角色实体:

用户实体:

use Doctrine\Common\Collections\ArrayCollection;

/**
 * USER ManyToMany with GROUP Unidirectional association
 * @var ArrayCollection
 * @ORM\ManyToMany(targetEntity="Group")
 * @ORM\JoinTable(name="user_groups")
 * @Assert\Valid
 */
protected $groups;

public function __construct()
{
    $this->groups = new ArrayCollection(); <-- add this line to the constructor
}

/**
 * Get all Groups added to the administrator
 * @return ArrayCollection $groups
 */
public function getGroups()
{
    return $this->groups;
}

/**
 * Add Group $group to the administrator
 *
 * @param \Group $group
 * @return void
 */
public function addGroup(Group $group)
{
    if (!$this->groups->contains($group)) {
        $this->groups->add($group);
    }
}

/**
 * Remove Group from the user
 * @param \Group $group
 * @return void
 */
public function removeGroup(Group $group)
{
    if ($this->groups->contains($group)) {
        $this->groups->removeElement($group);
    }
}

/**
 * Get all Roles added to the User
 * @return array
 */
public function getRoles()
{
    $roles = [];
    /** @var ArrayCollection $groups */
    $groups = $this->getGroups();

    foreach ($groups as $group) {
        $roles = array_merge($roles, $group->getRoles()->toArray());
    }

    $roles = array_unique($roles);

    # store the roles in the property to be serialized
    $this->roles = $roles;

    return $roles;
}

群组实体:

/**
 * GROUP ManyToMany with ROLE Unidirectional Association
 * @var ArrayCollection
 * @ORM\ManyToMany(targetEntity="Role")
 * @ORM\JoinTable(name="user_group_roles")
 * @Assert\Valid
 */
protected $roles;

public function __construct()
{
    $this->roles       = new ArrayCollection();
}

/**
 * Return all Roles added to this Group
 *
 * @return \Doctrine\Common\Collections\ArrayCollection $roles
 */
public function getRoles()
{
    return $this->roles;
}

/**
 * Add Role $role to the Group
 *
 * @param Role $role
 * @return void
 */
public function addRole(Role $role)
{
    if (! $this->roles->contains($role)) {
        $this->roles->add($role);
    }
}

/**
 * Remove Role from the Group
 *
 * @param Role $role
 * @return void
 */
public function removeRole(Role $role)
{
    if ($this->roles->contains($role)) {
        $this->roles->removeElement($role);
    }
}

这就是全部。希望对你有所帮助。