Zend_Acl находит все унаследованные роли - PullRequest
5 голосов
/ 20 марта 2011

Я получил цепочку ролей:

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 Ответ

14 голосов
/ 20 марта 2011

Вы можете использовать

  • getRoles() - Возвращает массив зарегистрированных ролей.

, а затем проверьте каждый из них с помощью

  • inheritsRole() - Возвращает true тогда и только тогда, когда $ role наследует от $ inherit

См. Документы API Zend_Acl в http://framework.zend.com/apidoc/core/Zend_Acl/Zend_Acl.html

* * Пример 1 022
$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, но, похоже, нет способа получить к нему доступ через открытый интерфейс Zend_Acl. Смотрите исходный код

Тривиально расширить 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; } }

...