我正在开发一个项目,因为我需要为不同实体的用户和角色提供解决方案。
用户实体
user
id
fname
lname
email
角色实体
roles
id
roles
user_roles 实体
id
user_id
role_id
您需要创建实现 RoleInterface 的 Role 类,并将其添加到具有 ManyToMany 关系的 User 类中,并在 getRoles() 方法中返回角色数组,就是这样。
使用多对多关系,如此处所述。在这种情况下,您只需要两个实体:
user
和role
,其他一切都由教义管理。请记住,在数据库中您仍然需要 3 个表(user
、role
和 user_role
)。
示例:
/** @Entity */
class User
{
// ...
/**
* @ManyToMany(targetEntity="Role")
* @JoinTable(name="user_role",
* joinColumns={@JoinColumn(name="user_id", referencedColumnName="id")},
* inverseJoinColumns={@JoinColumn(name="role_id", referencedColumnName="id", unique=true)}
* )
*/
private $roles;
public function __construct()
{
$this->roles = new \Doctrine\Common\Collections\ArrayCollection();
}
这是我的用户实体中的 getRoles 函数的示例:
/**
* Returns the user roles.
*
* @return array The roles
*/
public function getRoles()
{
$now = new \DateTime();
$roles = $this->roles;
foreach ($this->getGroups() as $group) {
$roles = array_merge($roles, $group->getRoles());
}
foreach ($this->getUserApplicationsPermissions() as $uap) {
if (
$uap->getPermanent() ||
($uap->getStartDate() < $now && !$uap->getEndDate()) ||
($uap->getStartDate() < $now && $uap->getEndDate() > $now)
) {
$roles = array_merge($roles, array($uap->getApplicationPermission()->getLibelle()));
}
}
// we need to make sure to have at least one role
$roles[] = static::ROLE_DEFAULT;
return array_unique($roles);
}
我的目标是处理fos用户角色+自制的角色系统,具有激活期或永久复选框。