我喜欢的结合ACL来模型的想法喜欢这里描述:Zend的ACL在模型VS Zend的导航
但我怎么能结合这与Zend的导航?在渲染站点地图时,我必须实例化所有模型。
是否有人在至少中等规模的网站上实际使用了这种方法,并且可以分享他解决性能问题的经验?
我喜欢的结合ACL来模型的想法喜欢这里描述:Zend的ACL在模型VS Zend的导航
但我怎么能结合这与Zend的导航?在渲染站点地图时,我必须实例化所有模型。
是否有人在至少中等规模的网站上实际使用了这种方法,并且可以分享他解决性能问题的经验?
你可以传递一个ACL实例直接到导航
$view->navigation ($navContainer)
->setAcl ($this->_acl)
->setRole (Zend_Registry::get ('role'));
这是我如何初始化的ACL在我的自举initAutoload方法
$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'));
这是根据从Zend_Acl里导出我的图书馆ACL文件。有关更多详细信息,请参阅此视频教程Zend Framework 1.8 tutorial 8 zend_navigation and 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);
希望它能帮助;)
谢谢。这是显而易见的部分,但是如何在导航ACL中存储模型时添加规则? – takeshin 2011-06-12 21:21:47
看看我的编辑。 – 2011-06-13 08:05:49
感谢您的编辑,但看起来你并不完全明白我在问什么:)我在询问实体中的ACL,而不是ACL *作为模型。 – takeshin 2011-06-13 18:51:11