你可以使用
-
getRoles() - 返回一个已注册角色的数组。
然后用
检查每一个
-
inheritsRole() - 当且仅当 $role 继承自 $inherit 时才返回 true
请参阅 API 文档 Zend_Acl http://framework.zend.com/apidoc/core/Zend_Acl/Zend_Acl.html
示例
$parents = array();
foreach ($acl->getRoles() as $inherit) {
if ($acl->inheritsRole('owner', $inherit)) {
$parents[] = $inherit;
}
}
然后会返回类似的东西
Array
(
[0] => guest
[1] => member
[2] => admin
)
另类
实际上有在Zend_Acl_Role_Registry 中有一个getParents() 方法,但似乎没有办法通过Zend_Acl 的公共接口访问它。查看源代码
虽然扩展 Zend_Acl 以拥有一个方法 getParentsForRole() 是微不足道的:
class My_Acl extends Zend_Acl
{
public function getParentsForRole($role)
{
return $this->_getRoleRegistry()->getParents($role);
}
}
这只会返回直接的父母,例如对于“所有者”,它返回“管理员”,因此您可能需要添加另一种方法以递归方式获取所有父级直到最后一个:
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;
}
}