Zend_Acl找到所有继承的角色

时间:2011-03-20 16:59:46

标签: php zend-framework inheritance roles zend-acl

我有一系列角色:

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

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

1 个答案:

答案 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