我喜欢将 ACL 绑定到此处描述的模型的想法:
但是我怎样才能将它与 Zend Navigation 结合起来呢?渲染站点地图时,我必须实例化所有模型。
是否有人在至少中等规模的站点上实际使用过这种方法,并且可以分享他在解决性能问题方面的经验?
我喜欢将 ACL 绑定到此处描述的模型的想法:
但是我怎样才能将它与 Zend Navigation 结合起来呢?渲染站点地图时,我必须实例化所有模型。
是否有人在至少中等规模的站点上实际使用过这种方法,并且可以分享他在解决性能问题方面的经验?
您可以将 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 教程 8 zend_navigation 和 zend_acl
我知道您不久前问过这个问题,但我认为分享我的代码会很有趣,因为我遇到了同样的问题。
基本上,我想出的是一种新的 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);
希望它可以帮助;)