我有一系列角色:
acl.roles.guest = null
acl.roles.member = "guest"
acl.roles.admin = "member"
acl.roles.owner = "admin"
在...... Controller / Action / Helper / Acl.php中我存储了_acl对象
这是获取我的角色和父母名单的方法吗?
$this->_acl->getParents ( 'admin' )
应该返回
admin, member, guest
作为数组或字符串(例如以逗号分隔)
答案 0 :(得分:14)
您可以使用
getRoles()
- 返回已注册角色的数组。 然后用
检查每一个inheritsRole()
- 当且仅当$ role继承自$ inherit时返回true 请参阅http://framework.zend.com/apidoc/core/Zend_Acl/Zend_Acl.html
上的API文档Zend_Acl
$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
方法,但似乎无法通过{{1}的公共接口访问该方法}}。查看源代码
将Zend_Acl
扩展为方法Zend_Acl
是微不足道的:
getParentsForRole()
这只会让直系亲属返回,例如为所有者'它返回' admin',所以你可能想要添加另一个方法来递归地获取所有父项到最后一个:
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
)
)
的单次调用返回的内容。如果你不需要,你也可以使用第一个例子中的foreach代码,例如
getParents