Конфигурируемый 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