我有几个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()
我看到的脏解决方案是解析源类并将文件合并为一个新类的方法。
有什么建议吗?
答案 0 :(得分:0)
我认为如果应用程序不了解自己,这几乎是不可能的。我前一段时间也有类似的问题,并没有找到任何令人满意的解决方案。合并时,您将丢失导航中稍后需要的一些信息(模块)。
我回到那里的第一个解决方案是迭代每个模块中的所有acl文件,并创建一个自定义ACL合并函数来合并它们。这实际上确实有效,但我不喜欢在我的完整应用程序上进行文件扫描的想法(即使结果被缓存)。
我的最后一种方法是向我的应用程序添加更多数据:对于每个可链接的操作,我定义了相应的acl文件。这听起来并不像听起来那么多。主要是因为我的控制器/模型几乎完全匹配。所以我有一个模型'新闻'和一个控制器'新闻',它处理对它的访问并将模型的每个动作映射到前端。所以我只需要指定acl / controller关系。 (我在每个导航容器中使用了一个自定义元素来保存它。)