gpt4 book ai didi

php - Zend_Acl 查找所有继承的角色

转载 作者:可可西里 更新时间:2023-11-01 13:39:27 27 4
gpt4 key购买 nike

我得到了角色链:

acl.roles.guest  = null
acl.roles.member = "guest"
acl.roles.admin = "member"
acl.roles.owner = "admin"

在 .....Controller/Action/Helper/Acl.php 中我存储了 _acl 对象

这是获取我的角色和 parent 列表的方法吗?

$this->_acl->getParents ( 'admin' )

应该返回

admin, member, guest

作为数组或字符串(例如逗号分隔)

最佳答案

你可以使用

  • 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 的公共(public)接口(interface)。查看源码

虽然扩展 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;
}
}

关于php - Zend_Acl 查找所有继承的角色,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5369964/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com