5

私は役割の連鎖を得ました:

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

配列または文字列として(例:コンマ区切り)

4

1 に答える 1

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方法はないようです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
        )    
)

これは、1回の呼び出しで返される内容と一致してい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;
    }
}
于 2011-03-20T17:08:17.270 に答える