В моем проекте мне нужно хранить иерархию роли в базе данных и динамически создавать новые роли.
В Symfony2 иерархия роли по умолчанию хранится в security.yml.
Что я нашел:
Существует услуга security.role_hierarchy (Symfony\Component\Security\Core\Role\RoleHierarchy);
Эта служба получает массив ролей в конструкторе:
public function __construct(array $hierarchy)
{
$this->hierarchy = $hierarchy;
$this->buildRoleMap();
}
и свойство $hierarchy является закрытым.
Этот аргумент приходит в конструкторе из \Symfony\Bundle\SecurityBundle\DependencyInjection\SecurityExtension::createRoleHierarchy()
который использует роли из config, как я понял:
$container->setParameter('security.role_hierarchy.roles', $config['role_hierarchy']);
Мне кажется, что лучший способ - собрать массив ролей из базы данных и установить его как аргумент для службы. Но я еще не понял, как это сделать.
Второй способ, который я вижу, - определить собственный класс RoleHierarchy, унаследованный от базового. Но так как в базовом классе RoleHierarchy свойство $hierarchy определяется как личное, то мне придется переопределить все функции из базового класса RoleHierarchy. Но я не думаю, что это хороший ООП и способ Symfony...