Минимум: ACL

554
.
Задача:
Конфигурируемый ACL.

Решение:
Опять же использую "замыкание" и функцию-фабрику:
function acl(array $allowed){
  return function($role, $resource, $operation) use($allowed){
    if(isset($allowed[$role])){
      if($allowed[$role] == '*'){
        return true;
      }

      if(isset($allowed[$role][$resource])){
        if($allowed[$role][$resource] == '*'){
          return true;
        }

        return in_array($operation, $allowed[$role][$resource]);
      }
    }

    return false;
  };
}


Работает по принципу: запрещено все, что не разрешено.

Используется так:
$acl = acl([
  'user' => [
    'article' => ['view'], // Обычные юзеры могут только view для article
  ],
  'moderator' => [
    'article' => '*', // Модераторы могут делать что угодно с article
  ],
  'admin' => '*', // Админ может вообще все
]);

var_dump($acl('user', 'article', 'view')); // true
var_dump($acl('user', 'article', 'edit')); // false
var_dump($acl('moderator', 'article', 'edit')); // true
.
Интересное решение
Всего: 2