Первый вопрос
Пожалуйста, не могли бы вы объяснить мне, как самый простой ACL может быть реализован в MVC.
Вот первый подход использования Acl в контроллере...
<?php
class MyController extends Controller {
  public function myMethod() {        
    //It is just abstract code
    $acl = new Acl();
    $acl->setController('MyController');
    $acl->setMethod('myMethod');
    $acl->getRole();
    if (!$acl->allowed()) die("You're not allowed to do it!");
    ...    
  }
}
?>
Это очень плохой подход, и это минус - нам нужно добавить часть кода Acl в каждый метод контроллера, но нам не нужны никакие дополнительные зависимости!
Следующим подходом является создание всех методов контроллера private и добавление кода ACL в метод контроллера __call.
<?php
class MyController extends Controller {
  private function myMethod() {
    ...
  }
  public function __call($name, $params) {
    //It is just abstract code
    $acl = new Acl();
    $acl->setController(__CLASS__);
    $acl->setMethod($name);
    $acl->getRole();
    if (!$acl->allowed()) die("You're not allowed to do it!");
    ...   
  }
}
?>
Это лучше, чем предыдущий код, но основные минусы...
- Все методы контроллера должны быть закрыты
- Мы должны добавить код ACL в каждый метод __call контроллера.
Следующий подход заключается в том, чтобы поместить Acl-код в родительский контроллер, но нам все равно нужно сохранить все методы дочернего контроллера.
Какое решение? И в чем лучшая практика? Где я могу вызвать функции Acl для принятия решения о разрешении или запрете метода, который должен быть выполнен.
Второй вопрос
Второй вопрос - получить роль, используя Acl. Представьте, что у нас есть гости, пользователи и друзья друзей. Пользователь имеет ограниченный доступ к просмотру своего профиля, который могут просматривать только друзья. Все гости не могут просматривать этот профиль пользователя. Итак, вот логика.
- мы должны обеспечить, чтобы вызываемый метод был профилем
- мы должны определить владельца этого профиля
- мы должны определить, является ли зритель владельцем этого профиля или нет
- мы должны прочитать правила ограничения этого профиля
- нам нужно решить выполнить или не выполнить метод профиля
Основной вопрос заключается в обнаружении владельца профиля. Мы можем определить, кто является владельцем профиля, только используя модельный метод $model- > getOwner(), но у Acl нет доступа к модели. Как мы можем это реализовать?
Я надеюсь, что мои мысли ясны. Извините за мой английский.
Спасибо.
