search_api-8.x-1.15/src/Entity/SearchApiConfigEntityStorage.php
src/Entity/SearchApiConfigEntityStorage.php
<?php namespace Drupal\search_api\Entity; use Drupal\Core\Config\Entity\ConfigEntityStorage; use Drupal\Core\Entity\EntityInterface; use Drupal\search_api\IndexInterface; /** * Provides a special storage for Search API config entities. * * This is necessary since post-save hooks would otherwise operate on * override-free entities, which is not desirable in our case. */ class SearchApiConfigEntityStorage extends ConfigEntityStorage { /** * {@inheritdoc} */ protected function doPostSave(EntityInterface $entity, $update) { $this->resetCache([$entity->id()]); // The entity is no longer new. $entity->enforceIsNew(FALSE); $overridden_entity = $this->load($entity->id()); if (isset($entity->original)) { $overridden_entity->original = $entity->original; // In the case of indexes, we also need to clone the fields to allow the // correct detection of renamed field. Conversely, we need to set the new, // rename-free fields on the passed index ($entity) so a subsequent save // won't false detect field renames. if ($entity instanceof IndexInterface) { /** @var \Drupal\search_api\IndexInterface $overridden_entity */ $old_fields = $entity->original->getFields(); $new_fields = $entity->getFields(); $saved_fields = $overridden_entity->getFields(); foreach ($entity->getFieldRenames() as $old_id => $new_id) { if (!empty($old_fields[$old_id]) && !empty($saved_fields[$new_id])) { $field = clone $new_fields[$new_id]; $field->setIndex($overridden_entity); $saved_fields[$new_id] = $field; } } $overridden_entity->setFields($saved_fields); } } // Allow code to run after saving. $overridden_entity->postSave($this, $update); $this->invokeHook($update ? 'update' : 'insert', $overridden_entity); if ($entity instanceof IndexInterface) { // Reset the field instances so saved renames won't be reported anymore. $entity->discardFieldChanges(); $overridden_entity->discardFieldChanges(); } // After saving, this is now the "original entity", and subsequent saves // will be updates instead of inserts, and updates must always be able to // correctly identify the original entity. $entity->setOriginalId($entity->id()); $overridden_entity->setOriginalId($entity->id()); unset($entity->original); unset($overridden_entity->original); } }