Я не могу комментировать, так что я Я сделаю свой комментарий как ответ. Как вы написали свою функцию getRoles, она вернет позицию массива как роли, что-то вроде, если у вас есть трехпозиционный массив, он будет возвращать 0,1,2 в качестве вариантов вместо имен ролей. Тогда я попытался что-то другое в этой строке, вместо:
array_walk_recursive($this->rolesHierarchy, function($val) use (&$roles) {
$roles[] = $val;
});
Я поставил
array_walk_recursive($this->rolesHierarchy, function($val) use (&$roles) {
$roles[$val] = $val;
});
Это решило проблему возвращения числовых позиций массива вместо имен ролей. Но возникла проблема, для иерархии, как это:
role_hierarchy:
ROLE_ADMIN: ROLE_USER
ROLE_SUPER_ADMIN: [ ROLE_ADMIN, ROLE_TEST ]
Было бы только вернуть ROLE_USER, ROLE_ADMIN и ROLE_TEST, но для Symfony, ROLE_ADMIN и ROLE_SUPER_ADMIN являются роли тоже. Проблема заключается в том, что array_walk_recursive не переходит к функции обратного вызова, ключ которой является значением массива. Поскольку ROLE_ADMIN является ARRAY (1) => ([0] => (строка) ROLE_USER), а ROLE_SUPER_ADMIN - ARRAY (2) => ([0] => (строка) ROLE_ADMIN [1] => (строка) ROLE_TEST), оба они будут проигнорированы.
Решение было сделать это:
public function getRoles() {
$roles = array();
foreach (array_keys($this->rolesHierarchy) as $key){
$roles[$key] = $key;
array_walk_recursive($this->rolesHierarchy[$key], function($val) use (&$roles){
$roles[$val] = $val;
});
}
return array_unique($roles);
Ключи массива считаются, сами роли также, что причина включать $ ролей [$ ключ] = $ ключ. И, чтобы пересчитать в каждый из массивов, содержащихся в иерархии:
array_walk_recursive($this->rolesHierarchy[$key], function($val) use (&$roles){
$roles[$val] = $val;
});