ConfigSubscriber.php in Field Encryption 3.0.x
File
src/EventSubscriber/ConfigSubscriber.php
View source
<?php
namespace Drupal\field_encrypt\EventSubscriber;
use Drupal\Core\Config\Config;
use Drupal\Core\Config\ConfigCrudEvent;
use Drupal\Core\Config\ConfigEvents;
use Drupal\Core\Entity\EntityTypeManagerInterface;
use Drupal\Core\Field\FieldStorageDefinitionEvent;
use Drupal\Core\Field\FieldStorageDefinitionEvents;
use Drupal\Core\Messenger\MessengerInterface;
use Drupal\Core\Queue\QueueFactory;
use Drupal\Core\StringTranslation\StringTranslationTrait;
use Drupal\Core\StringTranslation\TranslationInterface;
use Drupal\Core\Url;
use Drupal\field\Entity\FieldStorageConfig;
use Drupal\field_encrypt\StateManager;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
class ConfigSubscriber implements EventSubscriberInterface {
use StringTranslationTrait;
protected $entityTypeManager;
protected $queueFactory;
protected $stateManager;
protected $messenger;
public function __construct(EntityTypeManagerInterface $entity_type_manager, QueueFactory $queue_factory, StateManager $state_manager, TranslationInterface $translation, MessengerInterface $messenger) {
$this->entityTypeManager = $entity_type_manager;
$this->queueFactory = $queue_factory;
$this->stateManager = $state_manager;
$this->stringTranslation = $translation;
$this->messenger = $messenger;
}
public static function getSubscribedEvents() {
$events[ConfigEvents::SAVE][] = [
'onConfigSave',
0,
];
$events[ConfigEvents::DELETE][] = [
'onConfigDelete',
0,
];
$events[FieldStorageDefinitionEvents::DELETE] = [
'onBaseFieldDelete',
0,
];
return $events;
}
public function onConfigSave(ConfigCrudEvent $event) {
$config = $event
->getConfig();
if (substr($config
->getName(), 0, 14) == 'field.storage.') {
$this
->onFieldStorageChange($config);
}
if (!$config
->isNew() && $config
->getName() === 'field_encrypt.settings') {
$this
->onFieldEncryptSettingsChange($config);
}
}
protected function onFieldStorageChange(Config $config) {
$original_config = $config
->getOriginal('third_party_settings.field_encrypt');
if ($config
->get('third_party_settings.field_encrypt') === $original_config) {
return;
}
$storage_name = substr($config
->getName(), 14);
[
$entity_type,
$field_name,
] = explode('.', $storage_name, 2);
$field_storage_config = FieldStorageConfig::loadByName($entity_type, $field_name);
if ($field_storage_config) {
if ($field_storage_config
->hasData()) {
$query = $this->entityTypeManager
->getStorage($entity_type)
->getQuery();
$query
->exists($field_name);
if ($this->entityTypeManager
->getDefinition($entity_type)
->isRevisionable()) {
$query
->allRevisions();
}
$entity_ids = $query
->execute();
if (!empty($entity_ids)) {
$queue = $this->queueFactory
->get('field_encrypt_update_entity_encryption');
$data = [
'entity_type' => $entity_type,
];
foreach (array_keys($entity_ids) as $entity_id) {
$data['entity_id'] = $entity_id;
$queue
->createItem($data);
}
}
$this->messenger
->addMessage($this
->t('Updates to entities with existing data for this field have been queued to be processed. You should immediately <a href=":url">run this process manually</a>. Alternatively, the updates will be performed automatically by cron.', [
':url' => Url::fromRoute('field_encrypt.process_queue')
->toString(),
]));
}
}
$this->stateManager
->update();
}
protected function onFieldEncryptSettingsChange(Config $config) {
if ($config
->getOriginal('make_entities_uncacheable') !== $config
->get('make_entities_uncacheable')) {
$this->stateManager
->onFieldEncryptSettingsCacheChange();
}
}
public function onConfigDelete(ConfigCrudEvent $event) {
$config = $event
->getConfig();
if (substr($config
->getName(), 0, 14) == 'field.storage.') {
$this->stateManager
->update();
}
}
public function onBaseFieldDelete(FieldStorageDefinitionEvent $event) {
$field = $event
->getFieldStorageDefinition();
if ($event
->getFieldStorageDefinition()
->isBaseField()) {
$field_encrypt_settings = $this->entityTypeManager
->getStorage('field_encrypt_entity_type')
->load($field
->getTargetEntityTypeId());
if ($field_encrypt_settings && $field_encrypt_settings
->hasBaseField($field
->getName())) {
$field_encrypt_settings
->removeBaseField($field
->getName());
empty($field_encrypt_settings
->getBaseFields()) ? $field_encrypt_settings
->delete() : $field_encrypt_settings
->save();
}
}
}
}