模型中的Zend ACL vs Zend Navigation

| 我喜欢将ACL绑定到如下所述的模型的想法: http://weierophinney.net/matthew/archives/201-Applying-ACLs-to-Models.html 但是,如何将其与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\'));
这来自我的从Zend_Acl派生的库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()
)。 最后,我通过三个步骤实例化导航: 从XML文件获取配置 将资源字符串转换为对象 实例化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);
希望它能有所帮助;)     

要回复问题请先登录注册