【问题标题】:Zend ACL in models vs Zend Navigation模型中的 Zend ACL 与 Zend Navigation
【发布时间】:2011-06-12 19:22:18
【问题描述】:

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

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

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

【问题讨论】:

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


    【解决方案1】:

    您可以将 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

    【讨论】:

    • 谢谢。这是显而易见的部分,但是当它们存储在模型中时,如何将规则添加到导航 ACL 中?
    • 感谢您的编辑,但您似乎不太明白我在问什么 :) 我问的是实体中的 ACL,而不是 ACL as a模型。
    • 我刚刚添加了我自己的答案,顺便说一句,您还在您的应用程序中使用这种 ACL 方法吗?
    • 我想指出setAcl()setRole() 也适用于ZF2。我实际上是在为 ZF2 寻找这个解决方案,这个答案解决了它,谢谢! +1
    【解决方案2】:

    我知道你不久前问过这个问题,但我认为分享我的代码会很有趣,因为我遇到了同样的问题。

    基本上,我想出的是一种新的 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>
    

    这里有趣的是 resource 属性,它们实际上都是代表我的模型的类。

    现在,您可能在 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

    在您的引导程序中:

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

    希望对您有所帮助;)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-16
      • 2012-09-13
      • 2012-05-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多