Zend ACL в моделях против Zend Navigation

Мне нравится идея привязки ACL к моделям, как описано здесь:

Но как это совместить с Zend Navigation? При рендеринге карты сайта мне пришлось бы создать экземпляры всех моделей.

Кто-то действительно использовал этот подход хотя бы на сайте среднего размера и может ли поделиться своим опытом решения проблем с производительностью?


person takeshin    schedule 12.06.2011    source источник


Ответы (2)


Вы можете передать экземпляр acl прямо в навигацию

$view->navigation ( $navContainer )
     ->setAcl ( $this->_acl )
     ->setRole ( Zend_Registry::get ( 'role' ) );

Вот как я инициализирую acl в моем методе boostrap 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'));

Это из файла acl моей библиотеки, производного от Zend_Acl. Для получения более подробной информации просмотрите этот видеоурок Zend Framework 1.8, учебник 8 zend_navigation и zend_acl

person Upvote    schedule 12.06.2011
comment
Спасибо. Это очевидная часть, но как добавить правила в список управления доступом для навигации, если они хранятся в моделях? - person takeshin; 13.06.2011
comment
Спасибо за редактирование, но похоже, что вы не совсем понимаете, о чем я спрашиваю :) Я спрашиваю о ACL в объектах, а не о ACL как модели. - person takeshin; 13.06.2011
comment
Я только что добавил свой ответ, кстати, вы все еще используете этот подход ACL в своих приложениях? - person Liyali; 02.03.2012
comment
Хочу отметить, что setAcl() и setRole() также работают в ZF2. Я действительно искал это решение для ZF2, и этот ответ решил его, спасибо! +1 - person Yes Barry; 01.11.2012

Я знаю, что вы задали этот вопрос некоторое время назад, но я подумал, что было бы интересно поделиться своим кодом, поскольку я столкнулся с той же проблемой.

По сути, то, что я придумал, - это новый метод синтаксического анализа для файла 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

В вашем бутстрапе:

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

Надеюсь, это поможет;)

person Liyali    schedule 02.03.2012