【问题标题】:Show/Hide elements in Zend views based on User Role?基于用户角色在 Zend 视图中显示/隐藏元素?
【发布时间】:2012-02-25 05:21:47
【问题描述】:

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

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

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

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

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

【问题讨论】:

  • 这是一个类似的问题,请查看:stackoverflow.com/questions/8907820/… 另外,我希望当您写“而不是使用前端控制器插件”时,您实际上的意思是“除了使用前端控制器插件”; )
  • @bububaba 确实如此。谢谢你的澄清。

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


【解决方案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();

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

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

【讨论】:

    猜你喜欢
    • 2018-08-09
    • 1970-01-01
    • 1970-01-01
    • 2017-05-10
    • 2021-08-31
    • 2021-08-05
    • 1970-01-01
    • 1970-01-01
    • 2014-12-31
    相关资源
    最近更新 更多