You are here

abstract class AttributesAwareFieldableEdgeEntityBase in Apigee Edge 8

For fieldable Edge entities that can use attributes as field storage.

Hierarchy

Expanded class hierarchy of AttributesAwareFieldableEdgeEntityBase

1 file declares its use of AttributesAwareFieldableEdgeEntityBase
Team.php in modules/apigee_edge_teams/src/Entity/Team.php

File

src/Entity/AttributesAwareFieldableEdgeEntityBase.php, line 32

Namespace

Drupal\apigee_edge\Entity
View source
abstract class AttributesAwareFieldableEdgeEntityBase extends FieldableEdgeEntityBase implements AttributesAwareFieldableEdgeEntityBaseInterface {

  /**
   * The decorated SDK entity.
   *
   * @var \Apigee\Edge\Entity\EntityInterface|\Apigee\Edge\Entity\Property\AttributesPropertyInterface
   */
  protected $decorated;

  /**
   * AttributesAwareFieldableEntityBase constructor.
   *
   * @param array $values
   *   An array of values to set, keyed by property name.
   * @param null|string $entity_type
   *   Type of the entity. It is optional because constructor sets its default
   *   value.
   * @param \Apigee\Edge\Entity\EntityInterface|null $decorated
   *   The SDK entity that this Drupal entity decorates.
   */
  public function __construct(array $values, string $entity_type, ?EntityInterface $decorated = NULL) {
    parent::__construct($values, $entity_type, $decorated);
    if (!$this->decorated instanceof AttributesPropertyInterface) {
      throw new InvalidArgumentException(sprintf('Decorated SDK entity must be instance of %s interface, got %s.', AttributesPropertyInterface::class, get_class($decorated)));
    }
  }

  /**
   * Returns the field-attribute converter service.
   *
   * @return \Drupal\apigee_edge\FieldAttributeConverterInterface
   *   Field attribute convert service.
   */
  protected function fieldAttributeConverter() : FieldAttributeConverterInterface {
    return \Drupal::service('apigee_edge.converter.field_attribute');
  }

  /**
   * {@inheritdoc}
   */
  public function get($field_name) {
    $definition = $this
      ->getFieldDefinition($field_name);

    // No field found with this name.
    if ($definition === NULL) {
      return NULL;
    }

    // Ignore base fields, because their value should be stored in entity
    // properties.
    if ($definition instanceof BaseFieldDefinition) {
      return parent::get($field_name);
    }
    if (!isset($this->fields[$field_name])) {

      /** @var \Drupal\field\Entity\FieldConfig $definition */

      // Otherwise let's try to get the value of a field from an attribute
      // on the decorated entity.
      $value = $this
        ->fieldAttributeConverter()
        ->getFieldValueFromAttribute($this->entityTypeId, $field_name, $this->decorated
        ->getAttributes());

      // Based on \Drupal\Core\Entity\ContentEntityBase::getTranslatedField().

      /** @var \Drupal\Core\Field\FieldTypePluginManagerInterface $manager */
      $manager = \Drupal::service('plugin.manager.field.field_type');
      $this->fields[$field_name] = $manager
        ->createFieldItemList($this, $field_name, $value);
    }
    return $this->fields[$field_name];
  }

  /**
   * {@inheritdoc}
   */
  public function setPropertyValue(string $field_name, $value) : void {

    // If value is null, parent setPropertyValue() is going to ignore it
    // because SDK entity's simple property setters does not support parameters
    // with null value. But if field is not a base field then we have to clear
    // its value.
    if ($value === NULL && !$this
      ->getFieldDefinition($field_name) instanceof BaseFieldDefinition) {
      $this
        ->setAttributeValueFromField($field_name);
    }
    else {
      try {
        parent::setPropertyValue($field_name, $value);
      } catch (InvalidArgumentException $e) {

        // Property not found for the field, let's try to save field's value
        // as an attribute.
        $this
          ->setAttributeValueFromField($field_name);
      }
    }
  }

  /**
   * Sets attribute value from a field.
   *
   * @param string $field_name
   *   Name of a field, which must not be a base field.
   */
  private function setAttributeValueFromField(string $field_name) {

    // We need to unaltered field data value here not the field value returned
    // by $this->get($field_name)->value (magic getter).
    $field_value = $this
      ->get($field_name)
      ->getValue();

    // Property not found so let's save it as an attribute value.
    $attribute_value = $this
      ->fieldAttributeConverter()
      ->getAttributeValueFromField($this->entityTypeId, $field_name, $field_value);
    if ($attribute_value !== NULL) {
      $attribute_name = $this
        ->fieldAttributeConverter()
        ->getAttributeName($field_name);

      // Do not leave empty attributes. If generated attribute value is an
      // empty string let's remove it from the entity.
      // (Apigee Edge MGMT UI does not allow to save an entity with empty
      // attribute value, the API does.)
      if ($attribute_value === '') {
        $this->decorated
          ->deleteAttribute($attribute_name);
      }
      else {
        $this->decorated
          ->setAttribute($attribute_name, $attribute_value);
      }
    }
  }

}

Members

Namesort descending Modifiers Type Description Overrides
AttributesAwareFieldableEdgeEntityBase::$decorated protected property The decorated SDK entity. Overrides EdgeEntityBase::$decorated 2
AttributesAwareFieldableEdgeEntityBase::fieldAttributeConverter protected function Returns the field-attribute converter service.
AttributesAwareFieldableEdgeEntityBase::get public function Gets a field item list. Overrides FieldableEdgeEntityBase::get 1
AttributesAwareFieldableEdgeEntityBase::setAttributeValueFromField private function Sets attribute value from a field.
AttributesAwareFieldableEdgeEntityBase::setPropertyValue public function Updates the property value on an entity by field name. Overrides FieldableEdgeEntityBase::setPropertyValue
AttributesAwareFieldableEdgeEntityBase::__construct public function AttributesAwareFieldableEntityBase constructor. Overrides EdgeEntityBase::__construct 2
CacheableDependencyTrait::$cacheContexts protected property Cache contexts.
CacheableDependencyTrait::$cacheMaxAge protected property Cache max-age.
CacheableDependencyTrait::$cacheTags protected property Cache tags.
CacheableDependencyTrait::setCacheability protected function Sets cacheability; useful for value object constructors.
DependencySerializationTrait::$_entityStorages protected property An array of entity type IDs keyed by the property name of their storages.
DependencySerializationTrait::$_serviceIds protected property An array of service IDs keyed by property name used for serialization.
DependencySerializationTrait::__sleep public function Aliased as: traitSleep 1
DependencySerializationTrait::__wakeup public function 2
EdgeEntityBase::createFrom public static function Creates a Drupal entity from an SDK Entity. Overrides EdgeEntityInterface::createFrom
EdgeEntityBase::decorated public function Returns the decorated SDK entity. Overrides EdgeEntityInterface::decorated 2
EdgeEntityBase::decoratedClass abstract protected static function The FQCN of the decorated class from the PHP API Client. 5
EdgeEntityBase::drupalEntityId abstract protected function Return the entity id used in Drupal. 4
EdgeEntityBase::getTranslation public function
EdgeEntityBase::hasTranslation public function
EdgeEntityBase::id public function We have to override this to make it compatible with the SDK's entity interface that enforces the return type. Overrides EntityBase::id 5
EdgeEntityBase::isTranslatable public function
EdgeEntityBase::label public function Gets the label of the entity. Overrides EntityBase::label 2
EdgeEntityBase::uniqueIdProperties public static function Returns all unique ids how an entity can be referenced in Apigee Edge. Overrides EdgeEntityInterface::uniqueIdProperties 2
EdgeEntityBase::uniqueIds public function List of unique ids how an entity can be referenced in Apigee Edge. Overrides EdgeEntityInterface::uniqueIds
EntityBase::$enforceIsNew protected property Boolean indicating whether the entity should be forced to be new.
EntityBase::$entityTypeId protected property The entity type.
EntityBase::$typedData protected property A typed data object wrapping this entity.
EntityBase::access public function Checks data value access. Overrides AccessibleInterface::access 1
EntityBase::bundle public function Gets the bundle of the entity. Overrides EntityInterface::bundle 1
EntityBase::create public static function Constructs a new entity object, without permanently saving it. Overrides EntityInterface::create
EntityBase::createDuplicate public function Creates a duplicate of the entity. Overrides EntityInterface::createDuplicate 2
EntityBase::delete public function Deletes an entity permanently. Overrides EntityInterface::delete 2
EntityBase::enforceIsNew public function Enforces an entity to be new. Overrides EntityInterface::enforceIsNew
EntityBase::entityManager Deprecated protected function Gets the entity manager.
EntityBase::entityTypeBundleInfo protected function Gets the entity type bundle info service.
EntityBase::entityTypeManager protected function Gets the entity type manager.
EntityBase::getCacheContexts public function The cache contexts associated with this object. Overrides CacheableDependencyTrait::getCacheContexts
EntityBase::getCacheMaxAge public function The maximum age for which this object may be cached. Overrides CacheableDependencyTrait::getCacheMaxAge
EntityBase::getCacheTags public function The cache tags associated with this object. Overrides CacheableDependencyTrait::getCacheTags
EntityBase::getCacheTagsToInvalidate public function Returns the cache tags that should be used to invalidate caches. Overrides EntityInterface::getCacheTagsToInvalidate 2
EntityBase::getConfigDependencyKey public function Gets the key that is used to store configuration dependencies. Overrides EntityInterface::getConfigDependencyKey
EntityBase::getConfigDependencyName public function Gets the configuration dependency name. Overrides EntityInterface::getConfigDependencyName 1
EntityBase::getConfigTarget public function Gets the configuration target identifier for the entity. Overrides EntityInterface::getConfigTarget 1
EntityBase::getEntityType public function Gets the entity type definition. Overrides EntityInterface::getEntityType
EntityBase::getEntityTypeId public function Gets the ID of the type of the entity. Overrides EntityInterface::getEntityTypeId
EntityBase::getListCacheTagsToInvalidate protected function The list cache tags to invalidate for this entity.
EntityBase::getOriginalId public function Gets the original ID. Overrides EntityInterface::getOriginalId 1
EntityBase::getTypedData public function Gets a typed data object for this entity object. Overrides EntityInterface::getTypedData
EntityBase::hasLinkTemplate public function Indicates if a link template exists for a given key. Overrides EntityInterface::hasLinkTemplate
EntityBase::invalidateTagsOnDelete protected static function Invalidates an entity's cache tags upon delete. 1
EntityBase::invalidateTagsOnSave protected function Invalidates an entity's cache tags upon save. 1
EntityBase::isNew public function Determines whether the entity is new. Overrides EntityInterface::isNew 2
EntityBase::language public function Gets the language of the entity. Overrides EntityInterface::language 1
EntityBase::languageManager protected function Gets the language manager.
EntityBase::link public function Deprecated way of generating a link to the entity. See toLink(). Overrides EntityInterface::link 1
EntityBase::linkTemplates protected function Gets an array link templates. 1
EntityBase::load public static function Loads an entity. Overrides EntityInterface::load
EntityBase::loadMultiple public static function Loads one or more entities. Overrides EntityInterface::loadMultiple
EntityBase::postCreate public function Acts on a created entity before hooks are invoked. Overrides EntityInterface::postCreate 4
EntityBase::postDelete public static function Acts on deleted entities before the delete hook is invoked. Overrides EntityInterface::postDelete 16
EntityBase::postLoad public static function Acts on loaded entities. Overrides EntityInterface::postLoad 2
EntityBase::preCreate public static function Changes the values of an entity before it is created. Overrides EntityInterface::preCreate 5
EntityBase::preDelete public static function Acts on entities before they are deleted and before hooks are invoked. Overrides EntityInterface::preDelete 4
EntityBase::preSave public function Acts on an entity before the presave hook is invoked. Overrides EntityInterface::preSave 2
EntityBase::referencedEntities public function Gets a list of entities referenced by this entity. Overrides EntityInterface::referencedEntities 1
EntityBase::save public function Saves an entity permanently. Overrides EntityInterface::save 3
EntityBase::setOriginalId public function Sets the original ID. Overrides EntityInterface::setOriginalId 1
EntityBase::toLink public function Generates the HTML for a link to this entity. Overrides EntityInterface::toLink
EntityBase::toUrl public function Gets the URL object for the entity. Overrides EntityInterface::toUrl 2
EntityBase::uriRelationships public function Gets a list of URI relationships supported by this entity. Overrides EntityInterface::uriRelationships
EntityBase::url public function Gets the public URL for this entity. Overrides EntityInterface::url 2
EntityBase::urlInfo public function Gets the URL object for the entity. Overrides EntityInterface::urlInfo 1
EntityBase::urlRouteParameters protected function Gets an array of placeholders for this entity. 2
EntityBase::uuid public function Gets the entity UUID (Universally Unique Identifier). Overrides EntityInterface::uuid 1
EntityBase::uuidGenerator protected function Gets the UUID generator.
FieldableEdgeEntityBase::$fieldDefinitions protected property Local cache for field definitions.
FieldableEdgeEntityBase::$fields protected property Local cache for for fields.
FieldableEdgeEntityBase::$validated protected property Whether entity validation was performed.
FieldableEdgeEntityBase::$validationRequired protected property Whether entity validation is required before saving the entity.
FieldableEdgeEntityBase::baseFieldDefinitions public static function Provides base field definitions for an entity type. Overrides FieldableEntityInterface::baseFieldDefinitions 2
FieldableEdgeEntityBase::bundleFieldDefinitions public static function Provides field definitions for a specific bundle. Overrides FieldableEntityInterface::bundleFieldDefinitions
FieldableEdgeEntityBase::convertFieldValueToPropertyValue protected function Converts a field value to a property value.
FieldableEdgeEntityBase::exposePropertyAsBaseField private static function Returns whether an entity property is blacklisted to be exposed as field.
FieldableEdgeEntityBase::getBaseFieldDefinition protected static function Attempts to create a base field definition from a type.
FieldableEdgeEntityBase::getFieldDefinition public function Gets the definition of a contained field. Overrides FieldableEntityInterface::getFieldDefinition
FieldableEdgeEntityBase::getFieldDefinitions public function Gets an array of field definitions of all contained fields. Overrides FieldableEntityInterface::getFieldDefinitions
FieldableEdgeEntityBase::getFields public function Gets an array of all field item lists. Overrides FieldableEntityInterface::getFields
FieldableEdgeEntityBase::getFieldValue protected function Returns the field value from the current object.
FieldableEdgeEntityBase::getIterator public function
FieldableEdgeEntityBase::getProperties protected static function Parses the properties and its types from the parent class.
FieldableEdgeEntityBase::getTranslatableFields public function Gets an array of field item lists for translatable fields. Overrides FieldableEntityInterface::getTranslatableFields
FieldableEdgeEntityBase::hasField public function Determines whether the entity has a field with the given name. Overrides FieldableEntityInterface::hasField
FieldableEdgeEntityBase::isValidationRequired public function Checks whether entity validation is required before saving the entity. Overrides FieldableEntityInterface::isValidationRequired
FieldableEdgeEntityBase::onChange public function Reacts to changes to a field. Overrides FieldableEntityInterface::onChange
FieldableEdgeEntityBase::postSave public function Acts on a saved entity before the insert or update hook is invoked. Overrides EntityBase::postSave
FieldableEdgeEntityBase::propertyFieldType private static function Returns the type of the field that should represent an entity property.
FieldableEdgeEntityBase::propertyToBaseFieldBlackList protected static function Array of properties that should not be exposed as base fields by default. 2
FieldableEdgeEntityBase::propertyToBaseFieldTypeMap protected static function Static mapping between entity properties and Drupal field types. 2
FieldableEdgeEntityBase::set public function Sets a field value. Overrides FieldableEntityInterface::set 1
FieldableEdgeEntityBase::setValidationRequired public function Sets whether entity validation is required before saving the entity. Overrides FieldableEntityInterface::setValidationRequired
FieldableEdgeEntityBase::toArray public function Gets an array of all property values. Overrides EntityBase::toArray
FieldableEdgeEntityBase::validate public function Validates the currently set values. Overrides FieldableEntityInterface::validate
FieldableEdgeEntityBase::__sleep public function Overrides EntityBase::__sleep
RefinableCacheableDependencyTrait::addCacheableDependency public function 1
RefinableCacheableDependencyTrait::addCacheContexts public function
RefinableCacheableDependencyTrait::addCacheTags public function
RefinableCacheableDependencyTrait::mergeCacheMaxAge public function
RevisioningWorkaroundTrait::getLoadedRevisionId public function
RevisioningWorkaroundTrait::getRevisionId public function
RevisioningWorkaroundTrait::isDefaultRevision public function
RevisioningWorkaroundTrait::isLatestRevision public function
RevisioningWorkaroundTrait::isNewRevision public function
RevisioningWorkaroundTrait::preSaveRevision public function
RevisioningWorkaroundTrait::setNewRevision public function
RevisioningWorkaroundTrait::updateLoadedRevisionId public function
RevisioningWorkaroundTrait::wasDefaultRevision public function