Вы можете использовать
getRoles()
- Возвращает массив зарегистрированных ролей.
, а затем проверьте каждый из них с помощью
inheritsRole()
- Возвращает true тогда и только тогда, когда $ role наследует от $ inherit
См. Документы API Zend_Acl
в http://framework.zend.com/apidoc/core/Zend_Acl/Zend_Acl.html
* * Пример 1 022
$parents = array();
foreach ($acl->getRoles() as $inherit) {
if ($acl->inheritsRole('owner', $inherit)) {
$parents[] = $inherit;
}
}
, который затем возвращает что-то вроде
Array
(
[0] => guest
[1] => member
[2] => admin
)
Альтернатива
На самом деле - это метод getParents()
в Zend_Acl_Role_Registry
, но, похоже, нет способа получить к нему доступ через открытый интерфейс Zend_Acl
. Смотрите исходный код
Тривиально расширить Zend_Acl
, чтобы иметь метод getParentsForRole()
, хотя:
class My_Acl extends Zend_Acl
{
public function getParentsForRole($role)
{
return $this->_getRoleRegistry()->getParents($role);
}
}
Это только возвращает непосредственных родителей, например, например. для 'owner' он возвращает 'admin', поэтому вы можете захотеть добавить другой метод для рекурсивного извлечения всех родителей до последнего:
class My_Acl extends Zend_Acl
{
public function getAllParentsForRole($role, $parents = array())
{
foreach ($this->getParentsForRole($role) as $parentName => $parentRole) {
if (FALSE === isset($parents[$parentName])) {
$parents[$parentName] = $parentRole;
$parents = $this->getAllParentsForRole($parentRole, $parents);
}
}
return $parents;
}
public function getParentsForRole($role)
{
return $this->_getRoleRegistry()->getParents($role);
}
}
Пример * * тысяча пятьдесят-две
$acl = new My_Acl;
$acl->addRole('guest');
$acl->addRole('other');
$acl->addRole('member', 'guest');
$acl->addRole('admin', 'member');
$acl->addRole('owner', array('admin', 'other'));
print_r($acl->getAllParentsForRole('owner'));
приведет к
Array
(
[admin] => Zend_Acl_Role Object
(
[_roleId:protected] => admin
)
[member] => Zend_Acl_Role Object
(
[_roleId:protected] => member
)
[guest] => Zend_Acl_Role Object
(
[_roleId:protected] => guest
)
[other] => Zend_Acl_Role Object
(
[_roleId:protected] => other
)
)
, что соответствует тому, что вернул бы один вызов getParents
. Если вам это не нужно, вы также можете просто использовать код foreach из первого примера, например,
class My_Acl extends Zend_Acl
{
public function getAllParentsForRole($role)
{
$parents = array();
foreach ($this->getRoles() as $inherit) {
if($this->inheritsRole($role, $inherit)) {
$parents[] = $inherit;
}
}
return $parents;
}
}