2012-02-02 60 views
0

我是Zend和PHP的新手,我正准备开始一个门户类型应用程序的工作,该应用程序将包含多个内部应用程序。我已经设置了Zend_Auth,现在可以通过Active Directory登录。根据用户角色显示/隐藏Zend视图中的元素?

我们一直在讨论如何使用Zend_Acl来设置资源,门户中的每个应用程序都有一个资源。 Zend_Acl看起来好像会处理我们需要的授权和层次访问资源。

经过一番研究,我发现将Zend_Acl和Zend_Navigation结合是很常见的,但有时候会遇到问题。

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

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

+2

这里是一个类似的问题,看看:http://stackoverflow.com/questions/8907820/acl-and-appearance-manipulation-of-links-forms-and-dom-elements另外,我希望当你写了“而不是利用前端控制器插件”,你实际上的意思是“除了使用前端控制器插件”;) – bububaba 2012-02-02 15:05:27

+0

@bububaba确实。谢谢你的澄清。 – 2012-02-02 15:07:47

回答

1

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

在你CONTROLER你就需要将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(); 

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

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