模型中的Zend ACL与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'));

这来自我的库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>

这里有趣的是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);

希望能有所帮助;)

最新更新