0

我有几个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().
我看到的肮脏解决方案是解析源类并将文件合并为新类的一种方法。

有什么建议么?

4

1 回答 1

0

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

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

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

于 2010-12-16T08:49:59.990 回答