2

一連のロールを保持するユーザーとグループ エンティティがあります。

ここで、役割を変更したり、追加したりするためのオプションを開いたままにしておきたいと思います。

これにはクラスで定数を使用する必要がありますか、それとも 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);
}
4

1 に答える 1

2

各ユーザーとの ManyToOne 関係を持つ Roles テーブルを作成するのはどうですか。Roles テーブルの 1 つの行には、役割 (文字列または定数 int) とユーザーが含まれます。

または、Roles テーブルを作成して、User テーブルと ManyToMany 関係を持つこともできます。これを使用すると、役割を動的に定義できるため、可能な役割をハードコードする必要はありません。

OneToMany の場合、次のような関数を記述してロールを取得できます。

/** @OneToMany(...) */
/** $roles contains strings */
protected $roles;

public function getRoles() {
    return $this->roles;
}

また

/** @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;
}

User モデルは symfony のビルトイン User インターフェースを実装しなければならないことを忘れないでください。

グループの役割の場合、次のことができます。

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;
    }
}
于 2012-04-05T09:38:22.087 に答える