Zend ACL в моделях против Zend Navigation - PullRequest
2 голосов
/ 12 июня 2011

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

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

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

Ответы [ 2 ]

3 голосов
/ 13 июня 2011

Вы можете передать экземпляр 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

1 голос
/ 02 марта 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>

Здесь интересны атрибуты 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);

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

...