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\HookCode
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.