Symfony - 避免硬编码并使用动态角色

Symfony - avoid hardcoded and use dynamic roles

我正在 Symfony 6 项目中创建 角色管理

除了基本的 USER 角色(将被硬编码)之外,计划是所有其他角色都将来自数据库而不是被硬编码。 我知道很多 Symfony 指南和教程都假设您有一组有限的角色可以硬编码,但我不想在这里这样做。

常见角色是 USER , ADMINSUPERADMIN 但我想避免对 USER 以外的任何内容进行硬编码(任何经过身份验证的成员都应该拥有)。

我正在使用 DDD 方法,也许值得一提。

有人有什么建议吗?我将不胜感激一些关于此事的意见。

我假设使用:

class UserRoleEnum
{
    const ROLE_USER        = 'USER';
    const ROLE_ADMIN.      = 'ADMIN';
    const ROLE_SUPER_ADMIN = 'SUPER_AMDIN';
}

..这不是最好的方法吗?

如果您想拥有动态角色,那么为什么不创建一个具有角色的实体并向用户实体添加多对多关系。使用这种方法,您将能够在管理面板中动态分配必要的角色,并在必要时更方便地构建您的 sql 请求。

角色实体

/**  
 * @ORM\Entity()
 * @ORM\Table(name="roles") 
 */
class Role
{
    /**
     * @var int 
     *
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     * @ORM\Column(name="id", type="integer", unique=true)
     */
    private $id;

    /**
     * @var string
     *
     * @ORM\Column(name="name", type="string", length=225, unique=true)
     * @Assert\NotBlank()
     */
    private $name;
 }

用户实体

/**
 * @ORM\Table(name="users")
 * @ORM\Entity(repositoryClass=UserRepository::class) 
 */
class User implements UserInterface
{
    /**
     * @ORM\Id
     * @ORM\GeneratedValue
     * @ORM\Column(type="integer")
     */
    private $id;

    /** 
     * @ORM\ManyToMany(targetEntity="Role",cascade={"persist"})
     * @ORM\JoinTable(name="users_roles",
     *     joinColumns={@ORM\JoinColumn(name="user_id", referencedColumnName="id")},
     *     inverseJoinColumns={@ORM\JoinColumn(name="role_id", referencedColumnName="id")}
     * )
     */
    private $userRoles;

   // other properties

}