function FieldHooks::entityBundleFieldInfo

Implements hook_entity_bundle_field_info().

Attributes

#[Hook('entity_bundle_field_info')]

File

core/modules/field/src/Hook/FieldHooks.php, line 209

Class

FieldHooks
Hook implementations for field.

Namespace

Drupal\field\Hook

Code

public function entityBundleFieldInfo(EntityTypeInterface $entity_type, $bundle, array $base_field_definitions) : array {
  if (\Drupal::entityTypeManager()->getStorage($entity_type->id()) instanceof DynamicallyFieldableEntityStorageInterface) {
    $cid = 'field_bundle_field_info:' . $entity_type->id();
    if ($cached = $this->memoryCache
      ->get($cid)) {
      $fields = $cached->data;
    }
    else {
      $fields = [];
      // Query by filtering on the ID as this is more efficient than filtering
      // on the entity_type property directly.
      $ids = \Drupal::entityQuery('field_config')->condition('id', $entity_type->id() . '.', 'STARTS_WITH')
        ->execute();
      // Fetch all fields and key them by field name.
      $field_configs = FieldConfig::loadMultiple($ids);
      foreach ($field_configs as $field_instance) {
        $fields[$field_instance->getTargetBundle()][] = $field_instance->id();
      }
      $this->memoryCache
        ->set($cid, $fields, Cache::PERMANENT, [
        'entity_field_info',
      ]);
      $field_configs = array_filter($field_configs, static fn(FieldConfigInterface $field_instance) => $field_instance->getTargetBundle() === $bundle);
    }
    if (isset($fields[$bundle])) {
      // Rely on the entity static cache for the field config entity loading
      // so that it's not duplicated, to avoid memory and cache invalidation
      // issues.
      $bundle_fields = [];
      $field_configs ??= FieldConfig::loadMultiple($fields[$bundle]);
      foreach ($field_configs as $field_config) {
        $bundle_fields[$field_config->getName()] = $field_config;
      }
      return $bundle_fields;
    }
  }
  return [];
}

Buggy or inaccurate documentation? Please file an issue. Need support? Need help programming? Connect with the Drupal community.