permissions_repository-1.0.x-dev/src/Service/PermissionsRepositoryFactory.php
src/Service/PermissionsRepositoryFactory.php
<?php
declare(strict_types=1);
namespace Drupal\permissions_repository\Service;
use Drupal\Core\Entity\EntityTypeManagerInterface;
use Drupal\Core\StringTranslation\StringTranslationTrait;
use Drupal\Core\Utility\CallableResolver;
/**
* @todo Add class description.
*/
class PermissionsRepositoryFactory implements PermissionsRepositoryFactoryInterface {
use StringTranslationTrait;
/**
* Constructs a PermissionsRepositoryFactory object.
*/
public function __construct(
private readonly EntityTypeManagerInterface $entityTypeManager,
private readonly CallableResolver $callableResolver
) {}
protected function parsePermissionCallbacks(array $ary, string $provider, PermissionsRepositoryInterface $permissionObj) {
foreach ($ary as $callbackDefinition) {
$callback = $this->callableResolver->getCallableFromDefinition($callbackDefinition);
$permissions = call_user_func($callback);
if (!$permissions || !is_iterable($permissions)) {
continue;
}
// Add any callback permissions to the array of permissions. Any
// defaults can then get processed below.
foreach ($permissions as $key => $permissionAry) {
if (!is_array($permissionAry)) {
$permissionAry = [
'title' => $permissionAry,
];
}
if (empty($permissionAry['title'])) {
continue;
}
$permissionAry['key'] = $key;
$permissionAry['title'] = $this->tWrapper($permissionAry['title'], [], ['context' => 'permissions: permission title']);
$permissionAry['description'] = isset($permissionAry['description']) ? $this->tWrapper($permissionAry['description'], [], ['context' => 'permissions: permission description']) : NULL;
$permissionAry['provider'] = !empty($permissionAry['provider']) ? $permissionAry['provider'] : $provider;
$permissionAry['extended_help'] = !empty($permissionAry['extended_help']) ? $this->tWrapper($permissionAry['extended_help'], [], ['context' => 'permissions: extended help']) : '';
$permissionObj->addPermission($provider, $permissionAry);
}
}
}
protected function parseMain(array $ary, string $provider, PermissionsRepositoryInterface $permissionObj) {
if (!empty($ary['extended_help'])) {
$ary['extended_help'] = $this->tWrapper($ary['extended_help'], [], ['context' => 'permissions: extended help']);
$permissionObj->setMain($provider, $ary);
}
}
protected function parseSections(array $ary, string $provider, PermissionsRepositoryInterface $permissionObj) {
foreach ($ary as $section) {
if (empty($section['title'])) {
continue;
}
$section['key'] = $section['title'];
$section['title'] = $this->tWrapper($section['title'], [], ['context' => 'permissions: section title']);
$section['extended_help'] = !empty($section['extended_help']) ? $this->tWrapper($section['extended_help'], [], ['context' => 'permissions: extended help']) : '';
$permissionObj->addSection($provider, $section);
}
}
protected function parseSectionCallbacks(array $ary, string $provider, PermissionsRepositoryInterface $permissionObj) {
foreach ($ary as $callbackDefinition) {
$callback = $this->callableResolver->getCallableFromDefinition($callbackDefinition);
$sections = call_user_func($callback);
if (!$sections || !is_iterable($sections)) {
continue;
}
foreach ($sections as $section) {
if (!is_array($section)) {
$section = [
'title' => $section,
];
}
if (empty($section['title'])) {
continue;
}
$section['key'] = $section['title'];
$section['title'] = $this->tWrapper($section['title'], [], ['context' => 'permissions: section title']);
$section['extended_help'] = !empty($section['extended_help']) ? $this->tWrapper($section['extended_help'], [], ['context' => 'permissions: extended help']) : '';
$permissionObj->addSection($provider, $section);
}
}
}
protected function parseLoosePermissions($permissions, $provider, $permissionObj) {
foreach ($permissions as $key => $permissionAry) {
if (!is_array($permissionAry)) {
$permissionAry = [
'title' => $permissionAry,
];
}
if (empty($permissionAry['title'])) {
continue;
}
$permissionAry['key'] = $key;
$permissionAry['title'] = $this->tWrapper($permissionAry['title'], [], ['context' => 'permissions: permission title']);
$permissionAry['description'] = isset($permissionAry['description']) ? $this->tWrapper($permissionAry['description'], [], ['context' => 'permissions: permission description']) : NULL;
$permissionAry['provider'] = !empty($permissionAry['provider']) ? $permissionAry['provider'] : $provider;
$permissionAry['extended_help'] = !empty($permissionAry['extended_help']) ? $this->tWrapper($permissionAry['extended_help'], [], ['context' => 'permissions: extended help']) : '';
$permissionObj->addPermission($provider, $permissionAry);
}
}
protected function tWrapper($s, $options = [], $context = []) {
if (is_object($s)) {
return $s;
}
if (is_array($s)) {
$s = json_encode($s);
}
if (!is_string($s)) {
$s = '' . $s;
}
return $this->t($s, $options, $context);
}
/**
*/
public function createPermissionsRepository(array $list) {
$all_permissions = [];
$all_callback_permissions = [];
$permissionObj = new PermissionsRepository();
foreach ($list as $provider => $permissions) {
// The top-level 'permissions_callback' is a list of methods in callable
// syntax, see \Drupal\Core\Utility\CallableResolver. These methods
// should return an array of permissions in the same structure.
if (!empty($permissions['permission_callbacks'])) {
if (is_iterable($permissions['permission_callbacks'])) {
$this->parsePermissionCallbacks($permissions['permission_callbacks'], $provider, $permissionObj);
}
unset($permissions['permission_callbacks']);
}
if (!empty($permissions['main'])) {
if (is_iterable($permissions['main'])) {
$this->parseMain($permissions['main'], $provider, $permissionObj);
}
unset($permissions['main']);
}
if (!empty($permissions['section_callbacks'])) {
if (is_iterable($permissions['section_callbacks'])) {
$this->parseSectionCallbacks($permissions['section_callbacks'], $provider, $permissionObj);
}
unset($permissions['section_callbacks']);
}
if (!empty($permissions['sections'])) {
if (is_iterable($permissions['sections'])) {
$this->parseSections($permissions['sections'], $provider, $permissionObj);
}
unset($permissions['sections']);
}
if (!empty($permissions)) {
$this->parseLoosePermissions($permissions, $provider, $permissionObj);
}
}
$permissionObj->sortAll();
return $permissionObj;
return $permissionObj->getAllPermissions(PermissionsRepositoryReturnStyle::SectionArray);
return $permissionObj->getAllData(PermissionsRepositoryReturnStyle::SectionArray);
return $permissionObj->getProviderData('permissions_repository', PermissionsRepositoryReturnStyle::SectionArray);
}
}
