Zend_Acl找到所有继承的角色

ben*_*siu 5 php inheritance zend-framework roles zend-acl

我有一系列角色:

acl.roles.guest  = null
acl.roles.member = "guest"
acl.roles.admin  = "member"
acl.roles.owner  = "admin"
Run Code Online (Sandbox Code Playgroud)

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

这是获取我的角色和父母名单的方法吗?

$this->_acl->getParents ( 'admin' )
Run Code Online (Sandbox Code Playgroud)

应该回来

admin, member, guest
Run Code Online (Sandbox Code Playgroud)

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

Gor*_*don 14

您可以使用

  • getRoles()- 返回已注册角色的数组.

然后检查每一个

  • inheritsRole()- 当且仅当$ role继承自$ inherit时返回true

请参阅API文档Zend_Aclhttp://framework.zend.com/apidoc/core/Zend_Acl/Zend_Acl.html

$parents = array();
foreach ($acl->getRoles() as $inherit) {
    if ($acl->inheritsRole('owner', $inherit)) {
        $parents[] = $inherit;
    }
}
Run Code Online (Sandbox Code Playgroud)

然后会返回类似的东西

Array
(
    [0] => guest
    [1] => member
    [2] => admin
)
Run Code Online (Sandbox Code Playgroud)

替代

实际上一种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);
    }
}
Run Code Online (Sandbox Code Playgroud)

这只会返回直接父母,例如,对于'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);
    }
}
Run Code Online (Sandbox Code Playgroud)

$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'));
Run Code Online (Sandbox Code Playgroud)

会导致

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
        )    
)
Run Code Online (Sandbox Code Playgroud)

这符合单次调用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;
    }
}
Run Code Online (Sandbox Code Playgroud)