Здесь довольно болтливый ответ, только свободное обсуждение, без кода, по крайней мере, на данный момент.
Ваша собственная модель / структура данных должна учитывать членов, местоположения и команды.Я думаю, что вы описали отношения довольно четко, так что это должно быть просто.Мышление реляционно: стол для членов команды, включая менеджеров;стол для локаций;таблица для команд с внешним ключом в местоположениях и внешним ключом в участниках, идентифицирующих менеджера;таблица перекрестных ссылок, связывающая участников с командами.Я предполагаю, что ваша модель участника будет иметь методы для isManagerOfTeam($team)
, isMemberOfTeam($team)
, и тому подобное.Довольно просто.
Но многое из этого - просто моделирование отношений, возможно, независимых от контроля доступа.
Для контроля доступа кажется, что местоположение не имеет значения;это команда членство и команда менеджмент , которые являются ключом.
Это также похоже на данные, которые вы пытаетесь контролировать (что в конечном итоге станет ресурсом)') будет помечен идентификатором участника, идентифицирующим «владеющего» члена.Таким образом, модель для этих данных может иметь метод getMember()
или даже просто getMemberId()
.
Итак, я вижу некоторые правила Acl, которые используют экземпляр Zend_Acl_Assert_Interface
для проведения динамических проверок отношений между ролями($ member) и эти ресурсы:
- My_Acl_Assertion_BelongsToSelf
- My_Acl_Assertion_BelongToMemberUnderManagement
Затем методы assert()
могут вызывать соответствующие методы модели для методов соответствующей роли, которые передаются в соответствующие методы модели в моделях ролейи ресурсы для проверки отношений между командой и руководством.
Как я уже сказал, это довольно простой ответ, но надеется, что он поможет с некоторыми идеями.