function EntityFieldManager::buildBundleFieldDefinitions

Same name and namespace in other branches
  1. 9 core/lib/Drupal/Core/Entity/EntityFieldManager.php \Drupal\Core\Entity\EntityFieldManager::buildBundleFieldDefinitions()
  2. 8.9.x core/lib/Drupal/Core/Entity/EntityFieldManager.php \Drupal\Core\Entity\EntityFieldManager::buildBundleFieldDefinitions()
  3. 10 core/lib/Drupal/Core/Entity/EntityFieldManager.php \Drupal\Core\Entity\EntityFieldManager::buildBundleFieldDefinitions()

Builds field definitions for a specific bundle within an entity type.

Parameters

string $entity_type_id: The entity type ID. Only entity types that implement \Drupal\Core\Entity\FieldableEntityInterface are supported.

string $bundle: The bundle.

\Drupal\Core\Field\FieldDefinitionInterface[] $base_field_definitions: The list of base field definitions.

Return value

\Drupal\Core\Field\FieldDefinitionInterface[] An array of bundle field definitions, keyed by field name. Does not include base fields.

1 call to EntityFieldManager::buildBundleFieldDefinitions()
EntityFieldManager::getFieldDefinitions in core/lib/Drupal/Core/Entity/EntityFieldManager.php
Gets the field definitions for a specific bundle.

File

core/lib/Drupal/Core/Entity/EntityFieldManager.php, line 380

Class

EntityFieldManager
Manages the discovery of entity fields.

Namespace

Drupal\Core\Entity

Code

protected function buildBundleFieldDefinitions($entity_type_id, $bundle, array $base_field_definitions) {
    $entity_type = $this->entityTypeManager
        ->getDefinition($entity_type_id);
    // Use a bundle specific class if one is defined.
    $class = $this->entityTypeManager
        ->getStorage($entity_type_id)
        ->getEntityClass($bundle);
    // Allow the entity class to provide bundle fields and bundle-specific
    // overrides of base fields.
    $bundle_field_definitions = $class::bundleFieldDefinitions($entity_type, $bundle, $base_field_definitions);
    // Load base field overrides from configuration. These take precedence over
    // base field overrides returned above.
    $base_field_override_ids = array_map(function ($field_name) use ($entity_type_id, $bundle) {
        return $entity_type_id . '.' . $bundle . '.' . $field_name;
    }, array_keys($base_field_definitions));
    $base_field_overrides = $this->entityTypeManager
        ->getStorage('base_field_override')
        ->loadMultiple($base_field_override_ids);
    foreach ($base_field_overrides as $base_field_override) {
        
        /** @var \Drupal\Core\Field\Entity\BaseFieldOverride $base_field_override */
        $field_name = $base_field_override->getName();
        $bundle_field_definitions[$field_name] = $base_field_override;
    }
    $provider = $entity_type->getProvider();
    foreach ($bundle_field_definitions as $definition) {
        // @todo Remove this check once FieldDefinitionInterface exposes a proper
        //   provider setter. See https://www.drupal.org/node/2346329.
        if ($definition instanceof BaseFieldDefinition) {
            $definition->setProvider($provider);
        }
    }
    // Retrieve bundle field definitions from modules.
    $this->moduleHandler
        ->invokeAllWith('entity_bundle_field_info', function (callable $hook, string $module) use (&$bundle_field_definitions, $entity_type, $bundle, $base_field_definitions) {
        $module_definitions = $hook($entity_type, $bundle, $base_field_definitions) ?? [];
        // Ensure the provider key actually matches the name of the provider
        // defining the field.
        foreach ($module_definitions as $field_name => $definition) {
            // @todo Remove this check once FieldDefinitionInterface exposes a
            //   proper provider setter. See https://www.drupal.org/node/2346329.
            if ($definition instanceof BaseFieldDefinition) {
                $definition->setProvider($module);
            }
            $bundle_field_definitions[$field_name] = $definition;
        }
    });
    // Automatically set the field name, target entity type and bundle
    // for non-configurable fields.
    foreach ($bundle_field_definitions as $field_name => $field_definition) {
        if ($field_definition instanceof BaseFieldDefinition) {
            $field_definition->setName($field_name);
            $field_definition->setTargetEntityTypeId($entity_type_id);
        }
        if ($field_definition instanceof BaseFieldDefinition || $field_definition instanceof FieldDefinition) {
            $field_definition->setTargetBundle($bundle);
        }
    }
    // Invoke 'per bundle' alter hook.
    $this->moduleHandler
        ->alter('entity_bundle_field_info', $bundle_field_definitions, $entity_type, $bundle);
    return $bundle_field_definitions;
}

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