我有一个用户和一个组实体,它们都拥有一系列角色。
现在我想保持选项打开以修改角色,添加它们等等。
我是否应该在类中使用常量,还是应该将OneToOne关系与保留所有角色的表相关联?
最诚挚的问候, pus.dev
用户< =>角色 组< =>作用
public function getRoles()
{
$roles = $this->roles;
foreach ($this->getGroups() as $group) {
$roles = array_merge($roles, $group->getRoles());
}
// we need to make sure to have at least one role
$roles[] = static::ROLE_DEFAULT;
return array_unique($roles);
}
答案 0 :(得分:2)
如何创建与每个用户具有ManyToOne关系的Roles表。 Roles表的一行包含一个角色(字符串或常量int)和一个用户。
或者,您可以创建Roles表并与User表具有ManyToMany关系。使用它可以动态定义角色,因此您不必对可能的角色进行硬编码。
在OneToMany案例中,您可以通过编写这样的函数来检索角色:
/** @OneToMany(...) */
/** $roles contains strings */
protected $roles;
public function getRoles() {
return $this->roles;
}
OR
/** @OneToMany(...) */
/** $roles contains integers */
protected $roles;
public function getRoles() {
$rolesArr = array(1 => 'ROLE_ADMIN', 2 => 'ROLE_USER', 3 => 'ROLE_EDITOR'); // you should refactor $rolesArr
$retRoles = array();
foreach($this->roles as $role) {
$retRoles[] = $rolesArr[$role];
}
return $retRoles;
}
在ManyToMany案例中,您可以通过编写这样的函数来检索角色:
/** @ManyToMany(...) */
protected $roles;
// ...
public function getRoles() {
$retRoles = array();
// symfony2 requires a string array
foreach($this->roles as $role) {
$retRoles[] = $role->getName(); // or $retRoles[] = 'ROLE_' . $role->getName();
}
return $retRoles;
}
不要忘记您的用户模型必须实现symfony的内置用户界面。
对于群组角色,您可以这样做:
class Group
{
/** @ManyToMany(...) */
protected $roles;
public function getRoles() {
return $this->roles;
}
}
class User
{
/** @ORM\Column(...) */
protected $group;
/** @ManyToMany(...) */
protected $roles;
// ...
public function getRoles() {
$retRoles = array();
// symfony2 requires a string array
$roles = $this->roles->merge($this->group->getRoles());
foreach($roles as $role) {
$retRoles[] = $role->getName(); // or $retRoles[] = 'ROLE_' . $role->getName();
}
return $retRoles;
}
}