【问题标题】:Zend_Acl find all inherited rolesZend_Acl 查找所有继承的角色
【发布时间】:2011-07-19 04:53:44
【问题描述】:

我得到了一系列角色:

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

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

【问题讨论】:

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


    【解决方案1】:

    你可以使用

    • 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 的公共接口访问它。查看源代码

    虽然扩展 Zend_Acl 以拥有一个方法 getParentsForRole() 是微不足道的:

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

    这与对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;
        }
    }
    

    【讨论】:

    • 哇,哇,哇 - 我没想到这么复杂的答案,而且一切都按计划进行 - 我更喜欢通过 getRoles() 循环的第二种解决方案 - 谢谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-05
    • 1970-01-01
    • 2013-09-29
    • 2021-06-25
    相关资源
    最近更新 更多