class MetaEventSubscriber
Event subscriber which tests adding metadata to ResourceObjects and relationships.
@internal
Hierarchy
- class \Drupal\jsonapi_test_meta_events\EventSubscriber\MetaEventSubscriber implements \Symfony\Component\EventDispatcher\EventSubscriberInterface
Expanded class hierarchy of MetaEventSubscriber
1 string reference to 'MetaEventSubscriber'
- jsonapi_test_meta_events.services.yml in core/
modules/ jsonapi/ tests/ modules/ jsonapi_test_meta_events/ jsonapi_test_meta_events.services.yml - core/modules/jsonapi/tests/modules/jsonapi_test_meta_events/jsonapi_test_meta_events.services.yml
1 service uses MetaEventSubscriber
- jsonapi_test_meta_events.meta_subscriber in core/
modules/ jsonapi/ tests/ modules/ jsonapi_test_meta_events/ jsonapi_test_meta_events.services.yml - Drupal\jsonapi_test_meta_events\EventSubscriber\MetaEventSubscriber
File
-
core/
modules/ jsonapi/ tests/ modules/ jsonapi_test_meta_events/ src/ EventSubscriber/ MetaEventSubscriber.php, line 17
Namespace
Drupal\jsonapi_test_meta_events\EventSubscriberView source
class MetaEventSubscriber implements EventSubscriberInterface {
/**
* {@inheritdoc}
*/
public static function getSubscribedEvents() : array {
return [
CollectResourceObjectMetaEvent::class => 'addResourceObjectMeta',
CollectRelationshipMetaEvent::class => 'addRelationshipMeta',
];
}
/**
* @param \Drupal\jsonapi\Events\CollectResourceObjectMetaEvent $event
* Event to be processed.
*
* @return void
*/
public function addResourceObjectMeta(CollectResourceObjectMetaEvent $event) : void {
$config = \Drupal::state()->get('jsonapi_test_meta_events.object_meta', [
'enabled_type' => FALSE,
'enabled_id' => FALSE,
'fields' => FALSE,
'user_is_admin_context' => FALSE,
]);
// Only continue if the recourse type is enabled.
if ($config['enabled_type'] === FALSE || $config['enabled_type'] !== $event->getResourceObject()
->getTypeName()) {
return;
}
// Only apply on the referenced ID of the resource.
if ($config['enabled_id'] !== FALSE && $config['enabled_id'] !== $event->getResourceObject()
->getId()) {
return;
}
if ($config['fields'] === FALSE) {
return;
}
if ($config['user_is_admin_context']) {
$event->addCacheContexts([
'user.roles',
]);
$event->setMetaValue('resource_meta_user_has_admin_role', $this->currentUserHasAdminRole());
$event->setMetaValue('resource_meta_user_id', \Drupal::currentUser()->id());
}
// Add the metadata for each field. The field configuration must be an array
// of field values keyed by the field name.
foreach ($config['fields'] as $field_name) {
$event->setMetaValue('resource_meta_' . $field_name, $event->getResourceObject()
->getField($field_name)->value);
}
$event->addCacheTags([
'jsonapi_test_meta_events.object_meta',
]);
}
/**
* @param \Drupal\jsonapi\Events\CollectRelationshipMetaEvent $event
* Event to be processed.
*
* @return void
*/
public function addRelationshipMeta(CollectRelationshipMetaEvent $event) : void {
$config = \Drupal::state()->get('jsonapi_test_meta_events.relationship_meta', [
'enabled_type' => FALSE,
'enabled_id' => FALSE,
'enabled_relation' => FALSE,
'fields' => FALSE,
'user_is_admin_context' => FALSE,
]);
// Only continue if the resource type is enabled.
if ($config['enabled_type'] === FALSE || $config['enabled_type'] !== $event->getResourceObject()
->getTypeName()) {
return;
}
// Only apply on the referenced ID of the resource.
if ($config['enabled_id'] !== FALSE && $config['enabled_id'] !== $event->getResourceObject()
->getId()) {
return;
}
// Only continue if this is the correct relation.
if ($config['enabled_relation'] === FALSE || $config['enabled_relation'] !== $event->getRelationshipFieldName()) {
return;
}
$relationshipFieldName = $event->getRelationshipFieldName();
$field = $event->getResourceObject()
->getField($relationshipFieldName);
$referencedEntities = [];
if ($field instanceof EntityReferenceFieldItemListInterface) {
$referencedEntities = $field->referencedEntities();
$event->addCacheTags([
'jsonapi_test_meta_events.relationship_meta',
]);
}
if ($config['user_is_admin_context'] ?? FALSE) {
$event->addCacheContexts([
'user.roles',
]);
$event->setMetaValue('resource_meta_user_has_admin_role', $this->currentUserHasAdminRole());
}
// If no fields are specified just add a list of UUIDs to the relations.
if ($config['fields'] === FALSE) {
$referencedEntityIds = [];
foreach ($referencedEntities as $entity) {
$referencedEntityIds[] = $entity->uuid();
}
$event->setMetaValue('relationship_meta_' . $event->getRelationshipFieldName(), $referencedEntityIds);
return;
}
// Add the metadata for each field. The field configuration must be an array
// of field values keyed by the field name.
foreach ($config['fields'] as $field_name) {
$fieldValues = [];
foreach ($referencedEntities as $entity) {
$fieldValues[] = $entity->get($field_name)->value;
}
$event->setMetaValue('relationship_meta_' . $field_name, $fieldValues);
}
}
/**
* @return string
* @throws \Drupal\Component\Plugin\Exception\InvalidPluginDefinitionException
* @throws \Drupal\Component\Plugin\Exception\PluginNotFoundException
*/
protected function currentUserHasAdminRole() : string {
$admin_roles = \Drupal::entityTypeManager()->getStorage('user_role')
->loadByProperties([
'is_admin' => TRUE,
]);
$has_admin_role = 'yes';
if (count(array_intersect(\Drupal::currentUser()->getRoles(), array_keys($admin_roles))) === 0) {
$has_admin_role = 'no';
}
return $has_admin_role;
}
}
Members
Title Sort descending | Modifiers | Object type | Summary |
---|---|---|---|
MetaEventSubscriber::addRelationshipMeta | public | function | |
MetaEventSubscriber::addResourceObjectMeta | public | function | |
MetaEventSubscriber::currentUserHasAdminRole | protected | function | |
MetaEventSubscriber::getSubscribedEvents | public static | function |
Buggy or inaccurate documentation? Please file an issue. Need support? Need help programming? Connect with the Drupal community.