模型中的Zend ACL与Zend Navigation

时间:2011-06-12 19:22:18

标签: performance zend-framework acl zend-navigation zend-acl

我喜欢将ACL绑定到这里描述的模型的想法:

但我怎样才能将它与Zend Navigation结合起来?渲染站点地图时,我必须实例化所有模型。

是否有人在至少中等规模的网站上实际使用过这种方法,并且可以分享他在解决性能问题方面的经验?

2 个答案:

答案 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())。

最后,我通过三个步骤实例化我的导航:

  1. 从XML文件中获取配置
  2. 将资源字符串转换为对象
  3. 实例化Zend_Navigation
  4. 在你的引导程序中:

    $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);
    

    希望它可以提供帮助;)