在Zend视图中显示/隐藏基于用户角色的元素?

时间:2012-02-02 14:45:57

标签: php zend-framework zend-view zend-acl

我是Zend和PHP的新手,我正准备开始处理将容纳多个内部应用程序的门户类型应用程序。我已经设置了Zend_Auth,现在可以通过Active Directory登录了。

我们一直在讨论使用Zend_Acl来设置资源,一个用于门户网站中的每个应用程序。从表面上看,Zend_Acl似乎可以处理我们对资源的授权和分层访问所需的内容。

经过一些研究后,我发现将Zend_Acl与Zend_Navigation结合起来很常见,但有时会出现问题。

所要求的是,除了利用前端控制器插件检查每个请求的资源访问/权限之外,我们还将控制视图(HTML)中显示的元素给用户。例如,如果用户' Bob'我们无法访问博客应用程序,我们也不希望Bob在导航菜单上看到它。

对我来说,介绍所有这些逻辑,如果视图中的检查是错误的;我认为他们应该尽可能保持愚蠢。有没有更好的方法来处理这个?在视图代码中根据用户角色有条件地显示或隐藏元素对我来说是错误的。

1 个答案:

答案 0 :(得分:1)

如果你想从视图中删除逻辑,我建议使用视图助手。这样,您就可以从视图中抽象出ACL逻辑。

在您的控制器中,您需要将ACL对象传递给视图以供使用: -

$this->view->acl = $acl;//instance of Zend_Acl

然后你有一个视图助手来渲染一些元素: -

class Zend_View_Helper_SomeElement extends Zend_View_Helper_Abstract
{
    public function someElement()
    {
        $html = '';
        if($this->view->acl->isAllowed('guest', null, 'view'){
           $html .= "<div>Top secret content</div>\n";
        }
        return $html;
    }
}

然后你的观点就像: -

echo $this->someElement();

这使您的视图简单易读,同时您的逻辑被隐藏得很好。不理想,但在你的情况下,我认为这是我要采取的路线。

当然,通过传入参数,您的视图助手可以比这更具通用性。