使用Zend Framework PHP中的Zend_ACL在Zend_导航中分配多个角色?

使用Zend Framework PHP中的Zend_ACL在Zend_导航中分配多个角色?,php,arrays,roles,zend-navigation,zend-acl,Php,Arrays,Roles,Zend Navigation,Zend Acl,我无法让Zend_导航正常工作 当使用AUth/doctor登录用户时,我从多对多表中取出分配给用户的角色(通常是其中的几个角色) 然后在bootstrap.php联机中: $view->navigation($navContainer)->setAcl($this->\u acl)->setRole($this->\u role) 我得到一个错误: “$role必须是字符串、null或Zend_Acl_role_接口的实例;给定的数组' 但是,如果我使用foreach循环角色-前面的角色将被下

我无法让Zend_导航正常工作

当使用AUth/doctor登录用户时,我从多对多表中取出分配给用户的角色(通常是其中的几个角色)

然后在bootstrap.php联机中: $view->navigation($navContainer)->setAcl($this->\u acl)->setRole($this->\u role)

我得到一个错误: “$role必须是字符串、null或Zend_Acl_role_接口的实例;给定的数组'

但是,如果我使用foreach循环角色-前面的角色将被下面的角色覆盖,并且我只获得最后一个角色的nav

有人对此有什么合理的解决方案吗

非常感谢,,
亚当

我也遇到了同样的问题,但从稍微不同的角度来解决。我扩展了
Zend_Acl
并修改了
isAllowed()
方法来检查所有这些角色,而不是修改
Zend_导航
对象以接受两个或多个角色。
Zend\u导航
对象使用
isAllowed()
方法,因此重写此方法解决了问题

<pre><code>
class My_Acl extends Zend_Acl
{
    public function isAllowed($role = null, $resource = null, $privilege = null)
    {
        // Get all the roles to check against
        $userRoles = Zend_Registry::get('aclUserRoles');
        $isAllowed = false;

        // Loop through them one by one and check if they're allowed
        foreach ($userRoles as $role)
        {
            // Using the actual ACL isAllowed method here
            if (parent::isAllowed($role->code, $resource))
            {
                $isAllowed = true;
            }
        }

        return $isAllowed;
    }
}
</code></pre>
My_Acl.php


然后,使用
My_Acl
,而不是创建
Zend_Acl
的实例,将其传递给您的导航对象,它应该会工作。

我遇到了同样的问题,但从稍微不同的角度找到了解决方案。我扩展了
Zend_Acl
并修改了
isAllowed()
方法来检查所有这些角色,而不是修改
Zend_导航
对象以接受两个或多个角色。
Zend\u导航
对象使用
isAllowed()
方法,因此重写此方法解决了问题

<pre><code>
class My_Acl extends Zend_Acl
{
    public function isAllowed($role = null, $resource = null, $privilege = null)
    {
        // Get all the roles to check against
        $userRoles = Zend_Registry::get('aclUserRoles');
        $isAllowed = false;

        // Loop through them one by one and check if they're allowed
        foreach ($userRoles as $role)
        {
            // Using the actual ACL isAllowed method here
            if (parent::isAllowed($role->code, $resource))
            {
                $isAllowed = true;
            }
        }

        return $isAllowed;
    }
}
</code></pre>
My_Acl.php


然后,使用
My\u Acl
,而不是创建
Zend\u Acl
的实例,将其传递给导航对象,它就会工作。

您真的不应该,永远都不应该覆盖isAllowed(),是的,有一个解决方案。创建一个实现Zend_Acl_Role_接口的类,如果内存可用,则需要定义一个方法getRole(),实际上,这可能是您用来对用户进行身份验证并允许该类处理确定角色的模型。用户应该只有一个角色。如果对资源的访问权限应该授予多个角色的用户,但只有在某些条件下,那么您应该使用断言,这就是他们存在的原因。

您真的不应该覆盖isAllowed(),是的,有一个解决方案。创建一个实现Zend_Acl_Role_接口的类,如果内存可用,则需要定义一个方法getRole(),实际上,这可能是您用来对用户进行身份验证并允许该类处理确定角色的模型。用户应该只有一个角色。如果对资源的访问权限应该授予多个角色的用户,但只有在某些条件下,那么您应该使用断言,这就是为什么他们会在那里