Я довольно новичок в Zend Framework. Я начал изучать это во время проекта, над которым я все еще работаю в школе. Я немного застрял в том, как справиться с ACL в сочетании с моей модульной структурой (что мне действительно нравится), и исследования в Интернете, похоже, не дали нужной мне информации. Вероятно, это потому, что я еще не очень разбираюсь в фреймворке, но я все же подумал, что могу спросить здесь. Заранее спасибо!
На данный момент, следуя большинству лучших практик, которые я исследовал, я создал модульную структуру, например:
application/
modules/
admin/
default/
Я использую плагин для управления моим ACL, вот так (для простоты / читабельности я добавил только часть):
$acl = new Zend_Acl();
$acl->addRole(new Zend_Acl_Role('guest'))
->addRole(new Zend_Acl_Role('member'), 'guest');
->addRole(new Zend_Acl_Role('admin'), 'member');
$acl->addResource(new Zend_Acl_Resource('index'));
->addResource(new Zend_Acl_Resource('admin:index'));
$acl->allow('guest', 'index', array('index'));
->allow('member', 'index', array('userpanel'));
->allow('admin');
В любом случае, ACL все отлично работает на модуле по умолчанию - даже на модуле администратора, но проблема возникает, когда у меня одинаковые имена и действия контроллера, например:
This action will allow users to edit their own account
Module: Default
Controller: User
Action: Edit
This action will allow an admin to edit any account
Module: Admin
Controller: User
Action: Edit
Когда я устанавливаю правило в ACL следующим образом:
$acl->allow('member', 'user', array('edit'));
Пользователю также будет разрешен доступ к странице редактирования администратора на контроллере пользователя. Как мне сообщить ACL, что между модулями есть разница? Я видел много примеров использования «admin: user» вместо «user» в качестве имени контроллера / ресурса при добавлении ресурсов в ACL. Это, кажется, не работает, когда имена контроллера и / или действия идентичны.
Итак - главный вопрос: как мне решить эту проблему в моей текущей ситуации, или как бы вы предложили мне структурировать свое приложение, чтобы избежать проблемы все вместе? Я бы предпочел не прибегать к использованию дополнительных префиксов контроллера, таких как «Admin_AdminUserController», или просто удалять все модули вместе и просто делать «adminEditAction» и т. Д.