我喜欢将ACL绑定到这里描述的模型的想法:
但我怎样才能将它与Zend Navigation结合起来?渲染站点地图时,我必须实例化所有模型。
是否有人在至少中等规模的网站上实际使用过这种方法,并且可以分享他在解决性能问题方面的经验?
答案 0 :(得分:3)
您可以将acl实例直接传递到导航
$view->navigation ( $navContainer )
->setAcl ( $this->_acl )
->setRole ( Zend_Registry::get ( 'role' ) );
这是我在我的boostrap initAutoload方法中启动acl的方法
$this->_acl = new Model_LibraryAcl ();
$fc = Zend_Controller_Front::getInstance ();
$fc->registerPlugin ( new Plugin_AccessCheck ( $this->_acl ) );
我使用导航xml代码来定义我的导航,例如
<all>
<label>All</label>
<resource>default:programme</resource>
<module>default</module>
<controller>programme</controller>
<action>list</action>
<privilege>index</privilege>
</all>
这定义了列表操作的链接。它可以被所有用户访问,所以
$this->allow('guests', 'default:programme', array('index','list'));
这是来自我的库acl文件,该文件派生自Zend_Acl。有关更多详细信息,请参阅此视频教程Zend Framework 1.8 tutorial 8 zend_navigation and zend_acl
答案 1 :(得分:1)
我知道你刚才问过这个问题,但我认为分享我的代码会很有趣,因为我遇到了同样的问题。
基本上,我提出的是一个新的Xml文件解析方法,所以我可以直接将我的模型实例化到我的导航Xml配置文件,这样我的权限就可以正确地添加到我的ACL树。
让我们先来看看我的Xml菜单:
<?xml version="1.0" encoding="UTF-8" ?>
<configdata>
<nav>
<dashboard>
<label>Dashboard</label>
<controller>index</controller>
<action>index</action>
<class>icon-dashboard</class>
<resource>Model_Dashboard_Dashboard</resource>
</dashboard>
<members>
<label>Members</label>
<controller>members</controller>
<action>index</action>
<resource>Model_Members_Members</resource>
<class>icon-members</class>
<pages>
<members-list>
<label>Members list</label>
<controller>members</controller>
<action>list</action>
<resource>Model_Members_List</resource>
<privilege>list</privilege>
</members-list>
</pages>
</members>
<charts>
<label>Charts</label>
<controller>charts</controller>
<action>index</action>
<resource>Model_Charts_Charts</resource>
<class>icon-charts</class>
</charts>
<documents>
<label>Documents</label>
<controller>documents</controller>
<action>index</action>
<resource>Model_Documents_Documents</resource>
<class>icon-documents</class>
</documents>
</nav>
</configdata>
这里有趣的是资源属性,它们实际上都是代表我的模型的类。
现在,你可能在Zend文档中注意到了:
注意:返回类型
读入 Zend_Config_Xml 的配置数据是 总是作为字符串返回。将数据从字符串转换为其他字符串 类型留给开发人员以满足他们的特殊需求。
这意味着我的模型将被转换成字符串......真可惜!为了防止这种行为,我使用了将资源字符串转换为对象的函数:
public static function convertNavigationAclToObject($config)
{
foreach ($config as $key => $value) {
if (is_string($value) AND $key === "resource") {
$config[$key] = new $value;
break;
} elseif (is_array($value)) {
$config[$key] = self::convertNavigationAclToObject($value);
}
}
return $config;
}
这个函数允许我以递归方式将我的所有值转换为对象,因此同时设置权限(允许,拒绝......在模型中 - setAcl()
)。
最后,我通过三个步骤实例化我的导航:
在你的引导程序中:
$config = new Zend_Config_Xml(APPLICATION_PATH . /modules/default/views/navigation/navigation.xml', 'nav');
$pages = My_Utils::convertNavigationAclToObject($config->toArray());
$container = new Zend_Navigation($pages);
希望它可以提供帮助;)