class GroupRoleStorage in Group 2.0.x
Same name and namespace in other branches
- 8 src/Entity/Storage/GroupRoleStorage.php \Drupal\group\Entity\Storage\GroupRoleStorage
Defines the storage handler class for group role entities.
This extends the base storage class, adding required special handling for loading group role entities based on user and group information.
Hierarchy
- class \Drupal\Core\Entity\EntityHandlerBase uses DependencySerializationTrait, StringTranslationTrait
- class \Drupal\Core\Entity\EntityStorageBase implements EntityHandlerInterface, EntityStorageInterface
- class \Drupal\Core\Config\Entity\ConfigEntityStorage implements ConfigEntityStorageInterface, ImportableEntityStorageInterface
- class \Drupal\group\Entity\Storage\GroupRoleStorage implements GroupRoleStorageInterface
- class \Drupal\Core\Config\Entity\ConfigEntityStorage implements ConfigEntityStorageInterface, ImportableEntityStorageInterface
- class \Drupal\Core\Entity\EntityStorageBase implements EntityHandlerInterface, EntityStorageInterface
Expanded class hierarchy of GroupRoleStorage
File
- src/
Entity/ Storage/ GroupRoleStorage.php, line 25
Namespace
Drupal\group\Entity\StorageView source
class GroupRoleStorage extends ConfigEntityStorage implements GroupRoleStorageInterface {
/**
* Static cache of a user's group role IDs.
*
* @var array
*/
protected $userGroupRoleIds = [];
/**
* The entity type manager.
*
* @var \Drupal\Core\Entity\EntityTypeManagerInterface
*/
protected $entityTypeManager;
/**
* The group role synchronizer service.
*
* @var \Drupal\group\GroupRoleSynchronizerInterface
*/
protected $groupRoleSynchronizer;
/**
* The group membership loader.
*
* @var \Drupal\group\GroupMembershipLoaderInterface
*/
protected $groupMembershipLoader;
/**
* Constructs a GroupRoleStorage object.
*
* @param \Drupal\Core\Entity\EntityTypeManagerInterface $entity_type_manager
* The entity type manager.
* @param \Drupal\group\GroupRoleSynchronizerInterface $group_role_synchronizer
* The group role synchronizer service.
* @param \Drupal\group\GroupMembershipLoaderInterface $group_membership_loader
* The group membership loader.
* @param \Drupal\Core\Entity\EntityTypeInterface $entity_type
* The entity type definition.
* @param \Drupal\Core\Config\ConfigFactoryInterface $config_factory
* The config factory service.
* @param \Drupal\Component\Uuid\UuidInterface $uuid_service
* The UUID service.
* @param \Drupal\Core\Language\LanguageManagerInterface $language_manager
* The language manager.
* @param \Drupal\Core\Cache\MemoryCache\MemoryCacheInterface $memory_cache
* The memory cache backend.
*/
public function __construct(EntityTypeManagerInterface $entity_type_manager, GroupRoleSynchronizerInterface $group_role_synchronizer, GroupMembershipLoaderInterface $group_membership_loader, EntityTypeInterface $entity_type, ConfigFactoryInterface $config_factory, UuidInterface $uuid_service, LanguageManagerInterface $language_manager, MemoryCacheInterface $memory_cache) {
parent::__construct($entity_type, $config_factory, $uuid_service, $language_manager, $memory_cache);
$this->entityTypeManager = $entity_type_manager;
$this->groupRoleSynchronizer = $group_role_synchronizer;
$this->groupMembershipLoader = $group_membership_loader;
}
/**
* {@inheritdoc}
*/
public static function createInstance(ContainerInterface $container, EntityTypeInterface $entity_type) {
return new static($container
->get('entity_type.manager'), $container
->get('group_role.synchronizer'), $container
->get('group.membership_loader'), $entity_type, $container
->get('config.factory'), $container
->get('uuid'), $container
->get('language_manager'), $container
->get('entity.memory_cache'));
}
/**
* {@inheritdoc}
*/
public function loadByUserAndGroup(AccountInterface $account, GroupInterface $group, $include_implied = TRUE) {
$uid = $account
->id();
$gid = $group
->id();
$key = $include_implied ? 'include' : 'exclude';
if (!isset($this->userGroupRoleIds[$uid][$gid][$key])) {
$ids = [];
// Get the IDs from the 'group_roles' field, without loading the roles.
if ($membership = $this->groupMembershipLoader
->load($group, $account)) {
foreach ($membership
->getGroupContent()->group_roles as $group_role_ref) {
$ids[] = $group_role_ref->target_id;
}
}
// Add the implied group role IDs.
if ($include_implied) {
$group_type = $group
->getGroupType();
if ($membership !== FALSE) {
$ids[] = $group_type
->getMemberRoleId();
}
elseif ($account
->isAnonymous()) {
$ids[] = $group_type
->getAnonymousRoleId();
}
else {
$ids[] = $group_type
->getOutsiderRoleId();
foreach ($account
->getRoles(TRUE) as $role_id) {
$ids[] = $this->groupRoleSynchronizer
->getGroupRoleId($group_type
->id(), $role_id);
}
}
}
$this->userGroupRoleIds[$uid][$gid][$key] = $ids;
}
return $this
->loadMultiple($this->userGroupRoleIds[$uid][$gid][$key]);
}
/**
* {@inheritdoc}
*/
public function loadSynchronizedByGroupTypes(array $group_type_ids) {
return $this
->loadMultiple($this->groupRoleSynchronizer
->getGroupRoleIdsByGroupTypes($group_type_ids));
}
/**
* {@inheritdoc}
*/
public function loadSynchronizedByUserRoles(array $role_ids) {
return $this
->loadMultiple($this->groupRoleSynchronizer
->getGroupRoleIdsByUserRoles($role_ids));
}
/**
* {@inheritdoc}
*/
public function createInternal($group_type_ids = NULL) {
/** @var \Drupal\group\Entity\GroupTypeInterface[] $group_types */
$group_types = $this->entityTypeManager
->getStorage('group_type')
->loadMultiple($group_type_ids);
// Return early if there are no group types to create roles for.
if (empty($group_types)) {
return;
}
$definitions = [];
foreach ($group_types as $group_type_id => $group_type) {
// Build a list of group role definitions but do not save them yet so we
// can check whether they already exist in bulk instead of trying to find
// out on an individual basis here.
$definitions[$group_type
->getAnonymousRoleId()] = [
'id' => $group_type
->getAnonymousRoleId(),
'label' => $this
->t('Anonymous'),
'weight' => -102,
'internal' => TRUE,
'audience' => 'anonymous',
'group_type' => $group_type_id,
];
$definitions[$group_type
->getOutsiderRoleId()] = [
'id' => $group_type
->getOutsiderRoleId(),
'label' => $this
->t('Outsider'),
'weight' => -101,
'internal' => TRUE,
'audience' => 'outsider',
'group_type' => $group_type_id,
];
$definitions[$group_type
->getMemberRoleId()] = [
'id' => $group_type
->getMemberRoleId(),
'label' => $this
->t('Member'),
'weight' => -100,
'internal' => TRUE,
'group_type' => $group_type_id,
];
}
// See if the roles we just defined already exist.
$query = $this
->getQuery();
$query
->condition('id', array_keys($definitions));
// Create the group roles that do not exist yet.
foreach (array_diff_key($definitions, $query
->execute()) as $definition) {
$this
->save($this
->create($definition));
}
}
/**
* {@inheritdoc}
*/
public function createSynchronized($group_type_ids = NULL, $role_ids = NULL) {
// Load all possible group type IDs if none were provided.
if (empty($group_type_ids)) {
$group_type_ids = $this->entityTypeManager
->getStorage('group_type')
->getQuery()
->execute();
}
// Return early if there are no group types to create roles for.
if (empty($group_type_ids)) {
return;
}
/** @var \Drupal\User\RoleInterface[] $user_roles */
$user_roles = $this->entityTypeManager
->getStorage('user_role')
->loadMultiple($role_ids);
$definitions = [];
foreach (array_keys($user_roles) as $role_id) {
// We do not synchronize the 'anonymous' or 'authenticated' user roles as
// they are already taken care of by the 'anonymous' and 'outsider'
// internal group roles.
if ($role_id == 'anonymous' || $role_id == 'authenticated') {
continue;
}
// Build a list of group role definitions but do not save them yet so we
// can check whether they already exist in bulk instead of trying to find
// out on an individual basis here.
foreach ($group_type_ids as $group_type_id) {
$group_role_id = $this->groupRoleSynchronizer
->getGroupRoleId($group_type_id, $role_id);
$definitions[$group_role_id] = [
'id' => $group_role_id,
'label' => $user_roles[$role_id]
->label(),
'weight' => $user_roles[$role_id]
->getWeight(),
'internal' => TRUE,
'audience' => 'outsider',
'group_type' => $group_type_id,
'permissions_ui' => FALSE,
// Adding the user role as an enforced dependency will automatically
// delete any synchronized group role when its corresponding user role
// is deleted.
'dependencies' => [
'enforced' => [
'config' => [
$user_roles[$role_id]
->getConfigDependencyName(),
],
],
],
];
}
}
// See if the roles we just defined already exist.
$query = $this
->getQuery();
$query
->condition('id', array_keys($definitions));
// Create the group roles that do not exist yet.
foreach (array_diff_key($definitions, $query
->execute()) as $definition) {
$this
->save($this
->create($definition));
}
}
/**
* {@inheritdoc}
*/
public function updateSynchronizedLabels(RoleInterface $role) {
$group_roles = $this
->loadMultiple($this->groupRoleSynchronizer
->getGroupRoleIdsByUserRole($role
->id()));
foreach ($group_roles as $group_role) {
$group_role
->set('label', $role
->label());
$this
->save($group_role);
}
}
/**
* {@inheritdoc}
*/
public function resetUserGroupRoleCache(AccountInterface $account, GroupInterface $group = NULL) {
$uid = $account
->id();
if (isset($group)) {
unset($this->userGroupRoleIds[$uid][$group
->id()]);
}
else {
unset($this->userGroupRoleIds[$uid]);
}
}
}
Members
Name | Modifiers | Type | Description | Overrides |
---|---|---|---|---|
ConfigEntityStorage:: |
protected | property | The config factory service. | |
ConfigEntityStorage:: |
protected | property | The config storage service. | |
ConfigEntityStorage:: |
protected | property | The language manager. | |
ConfigEntityStorage:: |
protected | property | Determines if the underlying configuration is retrieved override free. | |
ConfigEntityStorage:: |
protected | property |
Name of entity's UUID database table field, if it supports UUIDs. Overrides EntityStorageBase:: |
|
ConfigEntityStorage:: |
protected | function |
Builds the cache ID for the passed in entity ID. Overrides EntityStorageBase:: |
|
ConfigEntityStorage:: |
public | function |
Creates a configuration entity from storage values. Overrides ConfigEntityStorageInterface:: |
|
ConfigEntityStorage:: |
public | function |
Delete a specific entity revision. Overrides EntityStorageInterface:: |
|
ConfigEntityStorage:: |
protected | function |
Performs storage-specific creation of entities. Overrides EntityStorageBase:: |
|
ConfigEntityStorage:: |
protected | function |
Performs storage-specific entity deletion. Overrides EntityStorageBase:: |
|
ConfigEntityStorage:: |
protected | function |
Performs storage-specific loading of entities. Overrides EntityStorageBase:: |
|
ConfigEntityStorage:: |
protected | function |
Performs storage-specific saving of the entity. Overrides EntityStorageBase:: |
|
ConfigEntityStorage:: |
public static | function |
Extracts the configuration entity ID from the full configuration name. Overrides ConfigEntityStorageInterface:: |
|
ConfigEntityStorage:: |
protected | function | Returns the prefix used to create the configuration name. | |
ConfigEntityStorage:: |
protected | function |
Gets the name of the service for the query for this entity storage. Overrides EntityStorageBase:: |
|
ConfigEntityStorage:: |
protected | function |
Determines if this entity already exists in storage. Overrides EntityStorageBase:: |
|
ConfigEntityStorage:: |
public | function |
Determines if the storage contains any data. Overrides EntityStorageBase:: |
|
ConfigEntityStorage:: |
public | function |
Creates entities upon synchronizing configuration changes. Overrides ImportableEntityStorageInterface:: |
1 |
ConfigEntityStorage:: |
public | function |
Delete entities upon synchronizing configuration changes. Overrides ImportableEntityStorageInterface:: |
2 |
ConfigEntityStorage:: |
public | function |
Renames entities upon synchronizing configuration changes. Overrides ImportableEntityStorageInterface:: |
|
ConfigEntityStorage:: |
public | function |
Updates entities upon synchronizing configuration changes. Overrides ImportableEntityStorageInterface:: |
1 |
ConfigEntityStorage:: |
protected | function |
Invokes a hook on behalf of the entity. Overrides EntityStorageBase:: |
|
ConfigEntityStorage:: |
public | function |
Loads one or more entities in their original form without overrides. Overrides ConfigEntityStorageInterface:: |
|
ConfigEntityStorage:: |
public | function |
Loads one entity in their original form without overrides. Overrides ConfigEntityStorageInterface:: |
|
ConfigEntityStorage:: |
public | function |
Load a specific entity revision. Overrides EntityStorageInterface:: |
|
ConfigEntityStorage:: |
protected | function | Maps from an entity object to the storage record. | 3 |
ConfigEntityStorage:: |
constant | Length limit of the configuration entity ID. | 1 | |
ConfigEntityStorage:: |
public | function |
Implements Drupal\Core\Entity\EntityStorageInterface::save(). Overrides EntityStorageBase:: |
|
ConfigEntityStorage:: |
public | function |
Updates a configuration entity from storage values. Overrides ConfigEntityStorageInterface:: |
|
ConfigEntityStorage:: |
protected | function | Helps create a configuration entity from storage values. | |
DependencySerializationTrait:: |
protected | property | ||
DependencySerializationTrait:: |
protected | property | ||
DependencySerializationTrait:: |
public | function | 2 | |
DependencySerializationTrait:: |
public | function | 2 | |
EntityHandlerBase:: |
protected | property | The module handler to invoke hooks on. | 5 |
EntityHandlerBase:: |
protected | function | Gets the module handler. | 5 |
EntityHandlerBase:: |
public | function | Sets the module handler for this handler. | |
EntityStorageBase:: |
protected | property | Name of the entity class. | |
EntityStorageBase:: |
protected | property | Information about the entity type. | |
EntityStorageBase:: |
protected | property | Entity type ID for this storage. | |
EntityStorageBase:: |
protected | property | Name of the entity's ID field in the entity database table. | |
EntityStorageBase:: |
protected | property | The name of the entity langcode property. | 1 |
EntityStorageBase:: |
protected | property | The memory cache. | |
EntityStorageBase:: |
protected | property | The memory cache cache tag. | |
EntityStorageBase:: |
protected | property | The UUID service. | 1 |
EntityStorageBase:: |
protected | function | Builds an entity query. | 1 |
EntityStorageBase:: |
public | function |
Constructs a new entity object, without permanently saving it. Overrides EntityStorageInterface:: |
1 |
EntityStorageBase:: |
public | function |
Deletes permanently saved entities. Overrides EntityStorageInterface:: |
2 |
EntityStorageBase:: |
protected | function | Performs post save entity processing. | 1 |
EntityStorageBase:: |
protected | function | Performs presave entity processing. | 1 |
EntityStorageBase:: |
public | function |
Gets an aggregated query instance. Overrides EntityStorageInterface:: |
|
EntityStorageBase:: |
public | function |
Gets the entity type definition. Overrides EntityStorageInterface:: |
|
EntityStorageBase:: |
public | function |
Gets the entity type ID. Overrides EntityStorageInterface:: |
|
EntityStorageBase:: |
protected | function | Gets entities from the static cache. | |
EntityStorageBase:: |
public | function |
Gets an entity query instance. Overrides EntityStorageInterface:: |
|
EntityStorageBase:: |
public | function |
Loads one entity. Overrides EntityStorageInterface:: |
2 |
EntityStorageBase:: |
public | function |
Load entities by their property values. Overrides EntityStorageInterface:: |
3 |
EntityStorageBase:: |
public | function |
Loads one or more entities. Overrides EntityStorageInterface:: |
1 |
EntityStorageBase:: |
public | function |
Loads an unchanged entity from the database. Overrides EntityStorageInterface:: |
1 |
EntityStorageBase:: |
protected | function | Maps from storage records to entity objects. | 4 |
EntityStorageBase:: |
protected | function | Attaches data to entities upon loading. | |
EntityStorageBase:: |
protected | function | Gathers entities from a 'preload' step. | 1 |
EntityStorageBase:: |
public | function |
Resets the internal entity cache. Overrides EntityStorageInterface:: |
1 |
EntityStorageBase:: |
public | function |
Restores a previously saved entity. Overrides EntityStorageInterface:: |
1 |
EntityStorageBase:: |
protected | function | Stores entities in the static entity cache. | |
EntityStorageInterface:: |
constant | Load the most recent version of an entity's field data. | ||
EntityStorageInterface:: |
constant | Load the version of an entity's field data specified in the entity. | ||
GroupRoleStorage:: |
protected | property | The entity type manager. | |
GroupRoleStorage:: |
protected | property | The group membership loader. | |
GroupRoleStorage:: |
protected | property | The group role synchronizer service. | |
GroupRoleStorage:: |
protected | property | Static cache of a user's group role IDs. | |
GroupRoleStorage:: |
public static | function |
Instantiates a new instance of this entity handler. Overrides ConfigEntityStorage:: |
|
GroupRoleStorage:: |
public | function |
Creates internal group roles for group types. Overrides GroupRoleStorageInterface:: |
|
GroupRoleStorage:: |
public | function |
Creates group roles for all user roles. Overrides GroupRoleStorageInterface:: |
|
GroupRoleStorage:: |
public | function |
Retrieves all GroupRole entities for a user within a group. Overrides GroupRoleStorageInterface:: |
|
GroupRoleStorage:: |
public | function |
Retrieves all synchronized GroupRole entities by group types. Overrides GroupRoleStorageInterface:: |
|
GroupRoleStorage:: |
public | function |
Retrieves all synchronized GroupRole entities by user roles. Overrides GroupRoleStorageInterface:: |
|
GroupRoleStorage:: |
public | function |
Resets the internal, static cache used by ::loadByUserAndGroup(). Overrides GroupRoleStorageInterface:: |
|
GroupRoleStorage:: |
public | function |
Updates the label of all group roles for a user role. Overrides GroupRoleStorageInterface:: |
|
GroupRoleStorage:: |
public | function |
Constructs a GroupRoleStorage object. Overrides ConfigEntityStorage:: |
|
StringTranslationTrait:: |
protected | property | The string translation service. | 4 |
StringTranslationTrait:: |
protected | function | Formats a string containing a count of items. | |
StringTranslationTrait:: |
protected | function | Returns the number of plurals supported by a given language. | |
StringTranslationTrait:: |
protected | function | Gets the string translation service. | |
StringTranslationTrait:: |
public | function | Sets the string translation service to use. | 2 |
StringTranslationTrait:: |
protected | function | Translates a string to the current language or to a given language. |