Zend_Acl find all inherited roles

I got a role chain:

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

in ..... Controller / Action / Helper / Acl.php I saved the _acl object

Is this a way to get a list of my role and parents?

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

must return

admin, member, guest

as an array or string (e.g., comma delimited)

+5
source share
1 answer

you can use

  • getRoles() - Returns an array of registered roles.

and then check each one with

  • inheritsRole() - returns true if and only if $ role inherits from $ inherit

See the API docs Zend_Aclat http://framework.zend.com/apidoc/core/Zend_Acl/Zend_Acl.html

Example

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

which will then return something like

Array
(
    [0] => guest
    [1] => member
    [2] => admin
)

Alternative

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);
    }
}

, , "" "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;
    }
}
+14

All Articles