如何在Zend Framework中合并几个ACL?

时间:2010-12-15 22:49:54

标签: php oop zend-framework zend-acl

我有几个Zend_Acl个对象的实例,比如这个(每个模块一个):

class My_Acl_Module1 extends My_Base_Acl
{
    public function __construct()
    {
        parent::__construct();
        $this->addResource('News_Model_Entry');
        $this->deny('guest', 'News_Model_Entry', 'index', new News_Model_Acl_Assert_CategoryPrivate());
    }       
}

class My_Base_Acl extends Zend_Acl 
{
    public function __construct()
    {
              $this->addRole('guest');
    }
}

如何将它们合并到一个ACL对象中以在导航容器中使用?

修改

更多信息:

  • 我不使用控制器资源来支持基于模型的资源(模型,表单实现Zend_Acl_Resource_Interface)。所有这些都有方法isAllowed()
  • 我使用模块化目录和可重复使用的模块(单独的模型,配置,路由等)。
  • 我的应用程序知道所有已安装的模块,控制器,操作(已解析的结构,而不是实时)

所以我正在寻找遵循这个方案的方法,并为每个模块分离ACL。我不想使用应用程序资源,因为它是一种浪费 - 总是不需要acl。

我有一个动作助手,只有在真正需要时才会实例化模块特定的ACL。但有时我也希望全局应用程序ACL可用(例如,当我想将它传递给导航视图助手或控制器插件时)。

我的模块ACL类只有一种方法:init() 我看到的脏解决方案是解析源类并将文件合并为一个新类的方法。

有什么建议吗?

1 个答案:

答案 0 :(得分:0)

我认为如果应用程序不了解自己,这几乎是不可能的。我前一段时间也有类似的问题,并没有找到任何令人满意的解决方案。合并时,您将丢失导航中稍后需要的一些信息(模块)。

我回到那里的第一个解决方案是迭代每个模块中的所有acl文件,并创建一个自定义ACL合并函数来合并它们。这实际上确实有效,但我不喜欢在我的完整应用程序上进行文件扫描的想法(即使结果被缓存)。

我的最后一种方法是向我的应用程序添加更多数据:对于每个可链接的操作,我定义了相应的acl文件。这听起来并不像听起来那么多。主要是因为我的控制器/模型几乎完全匹配。所以我有一个模型'新闻'和一个控制器'新闻',它处理对它的访问并将模型的每个动作映射到前端。所以我只需要指定acl / controller关系。 (我在每个导航容器中使用了一个自定义元素来保存它。)