hn-8.x-1.x-dev/modules/hn_cleaner/src/EventSubscriber/EventSubscriber.php
modules/hn_cleaner/src/EventSubscriber/EventSubscriber.php
<?php namespace Drupal\hn_cleaner\EventSubscriber; use Drupal\Core\Entity\Entity; use Drupal\Core\Entity\FieldableEntityInterface; use Drupal\hn\Event\HnEntityEvent; use Drupal\hn\Event\HnHandledEntityEvent; use Symfony\Component\EventDispatcher\EventSubscriberInterface; /** * Class DefaultSubscriber. */ class EventSubscriber implements EventSubscriberInterface { /** * {@inheritdoc} */ public static function getSubscribedEvents() { return [ HnEntityEvent::ADDED => 'nullifyEntityProperties', HnHandledEntityEvent::POST_HANDLE => 'unsetEntityProperties', ]; } /** * This nullifies entity properties before they are normalized. * * This improves performance, because these properties don't need to be * handled by the normalizer. * * @param \Drupal\hn\Event\HnEntityEvent $event * The event. */ public function nullifyEntityProperties(HnEntityEvent $event) { $entity = $event->getEntity(); $entity_type = $entity->getEntityTypeId(); $config = \Drupal::config('hn_cleaner.settings'); $removed_entities = $config->get('entities'); if (in_array($entity_type, $removed_entities)) { $event->setEntity(new NullEntity([], '')); return; } if (!$entity instanceof FieldableEntityInterface) { return; } $removed_properties = $config->get('fields.' . $entity->getEntityTypeId()); if (!empty($removed_properties)) { $entityDefinition = \Drupal::entityTypeManager()->getDefinition($entity->getEntityTypeId()); $entityKeys = $entityDefinition->getKeys(); $removed_properties = array_diff($removed_properties, $entityKeys); foreach ($removed_properties as $removed_property) { if ($entity->hasField($removed_property)) { $entity->set($removed_property, NULL); } } } } /** * This removes entity properties after they are normalized. * * @param \Drupal\hn\Event\HnHandledEntityEvent $event * The event. */ public function unsetEntityProperties(HnHandledEntityEvent $event) { $entity = $event->getEntity(); $handledEntity = $event->getHandledEntity(); if (!$entity instanceof FieldableEntityInterface) { return; } $config = \Drupal::config('hn_cleaner.settings'); $removed_properties = $config->get('fields.' . $entity->getEntityTypeId()); if (!empty($removed_properties)) { foreach ($removed_properties as $removed_property) { unset($handledEntity[$removed_property]); } } $event->setHandledEntity($handledEntity); } } /** * Entity without content. * * Can be used to replace an entity with NULL. */ class NullEntity extends Entity { }