Модульная система классов Zend_Acl - PullRequest
0 голосов
/ 08 января 2010

Привет, ребята, я начинаю с Zend и пытаюсь понять, как это работает (добираюсь), и с помощью классов Acl люди, кажется, объявляют все роли и ресурсы в одном файле. Сейчас мне кажется, что это пустая трата системных ресурсов, если человек входит в систему как обычный пользователь или даже просто как гость / посетитель сайта. Поэтому я подумал, возможно ли иметь разные классы, которые устанавливают роли в зависимости от роли / ресурса текущего пользователя.

Моя текущая идея состоит в том, чтобы использовать переключатель / регистр для роли в начальной загрузке и загружать отдельные классы Acl на основе имени роли (например, sake, 'visitor' => 'Model_VisitorAcl', 'users' => 'Model_UserAcl 'and' admin '=>' Model_AdminAcl '), каждый с соответствующим файлом класса. Затем в файлах классов сделайте что-нибудь для каждого. Это работает, и в настоящее время я могу определить все мои «административные» acls в одном (возврат по иерархии прав администратора-пользователя-посетителя), затем в «user» есть «user» - «visitor» роли и ресурсы.

Однако это не кажется лучшим способом, как если бы я хотел изменить полномочия роли для «пользователя», мне нужно было бы изменить его для «пользователя» и «администратора». Это не проблема с 2 ролями, но на больших системах это очевидно.

Итак, я попробовал что-то вроде

class Model_AdminAcl extends Zend_Acl{
  function __construct(){
    $d = new Model_UserAcl();

    //defining the admin role and permissions, with inheritance from the roles 
    //set in Model_UserAcl
  }
}

Чтобы попытаться запустить функцию конструирования Model_UserAcl, установив таким образом роль «пользователь», однако, похоже, это не сработает, выдав «Uncaught исключения» Zend_Acl_Role_Registry_Exception »с сообщением« Родительский идентификатор роли «пользователи» не существует » " ошибка.

Так каков следующий шаг? Наличие отдельных включаемых файлов для каждого модуля и наличие необходимых классов для их включения по мере необходимости?

Или я просто делаю из мухи слона с этой проблемой?

Спасибо, Psy

1 Ответ

0 голосов
/ 11 января 2010

Хорошо, решил это, не уверен, почему я не подумал попробовать это в первую очередь (я думаю, что пятничная мозговая утка)

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


//Model/VisitorAcl.php
class Model_VisitorAcl extends Zend_Acl{
  function __construct(){
    $this->addVisitorRules();
  }

  function addVisitorRules(){
    //adding the role and permissions
  }
}

//Model/UserAcl.php
class Model_UserAcl extends Model_VisitorAcl{
  function __construct(){
    $this->addVisitorRules();
    $this->addUserRules();
  }

  function addUserRules(){
    //adding the role and permissions
  }
}

//Model/AdminAcl.php
class Model_AdminAcl extends Model_AdminAcl{
  function __construct(){
    $this->addVisitorRules();
    $this->addUserRules();
    $this->addAdminRules();
  }

  function addAdminRules(){
    //adding the role and permissions
  }
}

Если я не согласен с этим, то, пожалуйста, обязательно сообщите мне.

Psy

...