class FieldDefinition

Same name in other branches
  1. 9 core/lib/Drupal/Core/Field/FieldDefinition.php \Drupal\Core\Field\FieldDefinition
  2. 8.9.x core/lib/Drupal/Core/Field/FieldDefinition.php \Drupal\Core\Field\FieldDefinition
  3. 10 core/lib/Drupal/Core/Field/FieldDefinition.php \Drupal\Core\Field\FieldDefinition

A class for defining entity field definitions.

A field definition in the context of a bundle field is different from a base field in that it may exist only for one or more bundles of an entity type. A bundle field definition may also override the definition of an existing base field definition on a per bundle basis. The bundle field definition is used for code driven overrides, while the \Drupal\Core\Field\Entity\BaseFieldOverride uses config to override the base field definition.

Bundle fields can be defined in code using hook_entity_bundle_field_info() or via the \Drupal\Core\Entity\FieldableEntityInterface::bundleFieldDefinitions() method when defining an entity type. All bundle fields require an associated storage definition. A storage definition may have automatically been defined when overriding a base field or it may be manually provided via hook_entity_field_storage_info().

Hierarchy

Expanded class hierarchy of FieldDefinition

See also

\Drupal\Core\Entity\FieldableEntityInterface::bundleFieldDefinitions()

\Drupal\Core\Field\FieldDefinitionInterface

\Drupal\Core\Field\FieldStorageDefinitionInterface

hook_entity_bundle_field_info()

hook_entity_field_storage_info()

5 files declare their use of FieldDefinition
entity.api.php in core/lib/Drupal/Core/Entity/entity.api.php
Hooks and documentation related to entities.
EntityFieldManager.php in core/lib/Drupal/Core/Entity/EntityFieldManager.php
EntityTestComputedBundleField.php in core/modules/system/tests/modules/entity_test/src/Entity/EntityTestComputedBundleField.php
entity_schema_test.module in core/modules/system/tests/modules/entity_schema_test/entity_schema_test.module
FieldDefinitionTest.php in core/tests/Drupal/Tests/Core/Entity/FieldDefinitionTest.php

File

core/lib/Drupal/Core/Field/FieldDefinition.php, line 35

Namespace

Drupal\Core\Field
View source
class FieldDefinition extends ListDataDefinition implements FieldDefinitionInterface {
    use UnchangingCacheableDependencyTrait;
    use FieldInputValueNormalizerTrait;
    
    /**
     * The associated field storage definition.
     *
     * @var \Drupal\Core\Field\FieldStorageDefinitionInterface
     */
    protected $fieldStorageDefinition;
    
    /**
     * Creates a new field definition.
     *
     * @param \Drupal\Core\Field\FieldStorageDefinitionInterface $storageDefinition
     *   The associated field storage definition.
     *
     * @return static
     */
    public static function createFromFieldStorageDefinition(FieldStorageDefinitionInterface $storageDefinition) {
        $field_definition = new static();
        $field_definition->setFieldStorageDefinition($storageDefinition);
        return $field_definition;
    }
    
    /**
     * {@inheritdoc}
     */
    public function getName() {
        return $this->getFieldStorageDefinition()
            ->getName();
    }
    
    /**
     * {@inheritdoc}
     */
    public function getType() {
        return $this->getFieldStorageDefinition()
            ->getType();
    }
    
    /**
     * {@inheritdoc}
     */
    public function getTargetEntityTypeId() {
        return $this->getFieldStorageDefinition()
            ->getTargetEntityTypeId();
    }
    
    /**
     * Set the target bundle.
     *
     * @param string $bundle
     *   The target bundle.
     *
     * @return $this
     */
    public function setTargetBundle($bundle) {
        $this->definition['bundle'] = $bundle;
        return $this;
    }
    
    /**
     * {@inheritdoc}
     */
    public function getTargetBundle() {
        return $this->definition['bundle'];
    }
    
    /**
     * Sets whether the display for the field can be configured.
     *
     * @param string $display_context
     *   The display context. Either 'view' or 'form'.
     * @param bool $configurable
     *   Whether the display options can be configured (e.g., via the "Manage
     *   display" / "Manage form display" UI screens). If TRUE, the options
     *   specified via getDisplayOptions() act as defaults.
     *
     * @return $this
     */
    public function setDisplayConfigurable($display_context, $configurable) {
        // If no explicit display options have been specified, default to 'hidden'.
        if (empty($this->definition['display'][$display_context])) {
            $this->definition['display'][$display_context]['options'] = [
                'region' => 'hidden',
            ];
        }
        $this->definition['display'][$display_context]['configurable'] = $configurable;
        return $this;
    }
    
    /**
     * {@inheritdoc}
     */
    public function isDisplayConfigurable($display_context) {
        return $this->definition['display'][$display_context]['configurable'] ?? FALSE;
    }
    
    /**
     * Sets the display options for the field in forms or rendered entities.
     *
     * This enables generic rendering of the field with widgets / formatters,
     * including automated support for "In place editing", and with optional
     * configurability in the "Manage display" / "Manage form display" UI screens.
     *
     * Unless this method is called, the field remains invisible (or requires
     * ad-hoc rendering logic).
     *
     * @param string $display_context
     *   The display context. Either 'view' or 'form'.
     * @param array $options
     *   An array of display options. Refer to
     *   \Drupal\Core\Field\FieldDefinitionInterface::getDisplayOptions() for
     *   a list of supported keys. The options should include at least a 'weight',
     *   or specify 'region' = 'hidden'. The 'default_widget'/'default_formatter'
     *   for the field type will be used if no 'type' is specified.
     *
     * @return $this
     */
    public function setDisplayOptions($display_context, array $options) {
        $this->definition['display'][$display_context]['options'] = $options;
        return $this;
    }
    
    /**
     * {@inheritdoc}
     */
    public function getDisplayOptions($display_context) {
        return $this->definition['display'][$display_context]['options'] ?? NULL;
    }
    
    /**
     * {@inheritdoc}
     */
    public function getDefaultValueLiteral() {
        return $this->definition['default_value'] ?? [];
    }
    
    /**
     * Set the default value callback for the field.
     *
     * @param string $callback
     *   The default value callback.
     *
     * @return $this
     */
    public function setDefaultValueCallback($callback) {
        if (isset($callback) && !is_string($callback)) {
            throw new \InvalidArgumentException('Default value callback must be a string, like "function_name" or "ClassName::methodName"');
        }
        $this->definition['default_value_callback'] = $callback;
        return $this;
    }
    
    /**
     * {@inheritdoc}
     */
    public function getDefaultValueCallback() {
        return $this->definition['default_value_callback'] ?? NULL;
    }
    
    /**
     * Set a default value for the field.
     *
     * @param mixed $value
     *   The default value.
     *
     * @return $this
     */
    public function setDefaultValue($value) {
        $this->definition['default_value'] = $this->normalizeValue($value, $this->getFieldStorageDefinition()
            ->getMainPropertyName());
        return $this;
    }
    
    /**
     * {@inheritdoc}
     */
    public function getDefaultValue(FieldableEntityInterface $entity) {
        // Allow custom default values function.
        if ($callback = $this->getDefaultValueCallback()) {
            $value = call_user_func($callback, $entity, $this);
        }
        else {
            $value = $this->getDefaultValueLiteral();
        }
        $value = $this->normalizeValue($value, $this->getFieldStorageDefinition()
            ->getMainPropertyName());
        // Allow the field type to process default values.
        $field_item_list_class = $this->getClass();
        return $field_item_list_class::processDefaultValue($value, $entity, $this);
    }
    
    /**
     * Sets whether the field is translatable.
     *
     * @param bool $translatable
     *   Whether the field is translatable.
     *
     * @return $this
     */
    public function setTranslatable($translatable) {
        $this->definition['translatable'] = $translatable;
        return $this;
    }
    
    /**
     * {@inheritdoc}
     */
    public function isTranslatable() {
        return !empty($this->definition['translatable']) && $this->getFieldStorageDefinition()
            ->isTranslatable();
    }
    
    /**
     * Set the field storage definition.
     *
     * @param \Drupal\Core\Field\FieldStorageDefinitionInterface $storageDefinition
     *   The field storage definition associated with this field definition.
     *
     * @return $this
     */
    public function setFieldStorageDefinition(FieldStorageDefinitionInterface $storageDefinition) {
        $this->fieldStorageDefinition = $storageDefinition;
        $this->itemDefinition = FieldItemDataDefinition::create($this);
        // Create a definition for the items, and initialize it with the default
        // settings for the field type.
        $field_type_manager = \Drupal::service('plugin.manager.field.field_type');
        $default_settings = $field_type_manager->getDefaultFieldSettings($storageDefinition->getType());
        $this->itemDefinition
            ->setSettings($default_settings);
        return $this;
    }
    
    /**
     * {@inheritdoc}
     */
    public function getFieldStorageDefinition() {
        return $this->fieldStorageDefinition;
    }
    
    /**
     * {@inheritdoc}
     */
    public function getConfig($bundle) {
        // @todo provide a FieldDefinitionOverride config entity in
        // https://www.drupal.org/project/drupal/issues/2935978.
        throw new \Exception('Field definitions do not currently have an override config entity.');
    }
    
    /**
     * {@inheritdoc}
     */
    public function getUniqueIdentifier() {
        return $this->getTargetEntityTypeId() . '-' . $this->getTargetBundle() . '-' . $this->getName();
    }
    
    /**
     * {@inheritdoc}
     */
    public function getSetting($setting_name) {
        if (array_key_exists($setting_name, $this->itemDefinition
            ->getSettings())) {
            return $this->itemDefinition
                ->getSetting($setting_name);
        }
        else {
            return $this->getFieldStorageDefinition()
                ->getSetting($setting_name);
        }
    }
    
    /**
     * {@inheritdoc}
     */
    public function getSettings() {
        return $this->getItemDefinition()
            ->getSettings() + $this->getFieldStorageDefinition()
            ->getSettings();
    }
    
    /**
     * {@inheritdoc}
     */
    public function setSetting($setting_name, $value) {
        $this->getItemDefinition()
            ->setSetting($setting_name, $value);
        return $this;
    }
    
    /**
     * {@inheritdoc}
     */
    public function setSettings(array $settings) {
        // Assign settings individually, in order to keep the current values
        // of settings not specified in $settings.
        foreach ($settings as $setting_name => $setting) {
            $this->getItemDefinition()
                ->setSetting($setting_name, $setting);
        }
        return $this;
    }

}

Members

Title Sort descending Modifiers Object type Summary Overriden Title Overrides
DataDefinition::$definition protected property The array holding values for all definition keys.
DataDefinition::addConstraint public function Overrides DataDefinitionInterface::addConstraint
DataDefinition::getConstraint public function Overrides DataDefinitionInterface::getConstraint
DataDefinition::getConstraints public function Overrides DataDefinitionInterface::getConstraints 1
DataDefinition::getDescription public function Overrides DataDefinitionInterface::getDescription
DataDefinition::getLabel public function Overrides DataDefinitionInterface::getLabel 1
DataDefinition::isComputed public function Overrides DataDefinitionInterface::isComputed
DataDefinition::isInternal public function Overrides DataDefinitionInterface::isInternal 1
DataDefinition::isList public function Overrides DataDefinitionInterface::isList
DataDefinition::isReadOnly public function Overrides DataDefinitionInterface::isReadOnly
DataDefinition::isRequired public function Overrides DataDefinitionInterface::isRequired
DataDefinition::offsetExists public function This is for BC support only.
@todo Remove in https://www.drupal.org/node/1928868.
DataDefinition::offsetGet public function This is for BC support only.
@todo Remove in https://www.drupal.org/node/1928868.
DataDefinition::offsetSet public function This is for BC support only.
@todo Remove in https://www.drupal.org/node/1928868.
DataDefinition::offsetUnset public function This is for BC support only.
@todo Remove in https://www.drupal.org/node/1928868.
DataDefinition::setClass public function Sets the class used for creating the typed data object.
DataDefinition::setComputed public function Sets whether the data is computed.
DataDefinition::setConstraints public function Sets an array of validation constraints.
DataDefinition::setDescription public function Sets the human-readable description.
DataDefinition::setInternal public function Sets the whether the data value should be internal.
DataDefinition::setLabel public function Sets the human-readable label.
DataDefinition::setReadOnly public function Sets whether the data is read-only.
DataDefinition::setRequired public function Sets whether the data is required.
DataDefinition::toArray public function Returns all definition values as array.
DataDefinition::__sleep public function 2
FieldDefinition::$fieldStorageDefinition protected property The associated field storage definition.
FieldDefinition::createFromFieldStorageDefinition public static function Creates a new field definition.
FieldDefinition::getConfig public function Overrides FieldDefinitionInterface::getConfig
FieldDefinition::getDefaultValue public function Overrides FieldDefinitionInterface::getDefaultValue
FieldDefinition::getDefaultValueCallback public function Overrides FieldDefinitionInterface::getDefaultValueCallback
FieldDefinition::getDefaultValueLiteral public function Overrides FieldDefinitionInterface::getDefaultValueLiteral
FieldDefinition::getDisplayOptions public function Overrides FieldDefinitionInterface::getDisplayOptions
FieldDefinition::getFieldStorageDefinition public function Overrides FieldDefinitionInterface::getFieldStorageDefinition
FieldDefinition::getName public function Overrides FieldDefinitionInterface::getName
FieldDefinition::getSetting public function Overrides DataDefinition::getSetting
FieldDefinition::getSettings public function Overrides DataDefinition::getSettings
FieldDefinition::getTargetBundle public function Overrides FieldDefinitionInterface::getTargetBundle
FieldDefinition::getTargetEntityTypeId public function Overrides FieldDefinitionInterface::getTargetEntityTypeId
FieldDefinition::getType public function Overrides FieldDefinitionInterface::getType
FieldDefinition::getUniqueIdentifier public function Overrides FieldDefinitionInterface::getUniqueIdentifier
FieldDefinition::isDisplayConfigurable public function Overrides FieldDefinitionInterface::isDisplayConfigurable
FieldDefinition::isTranslatable public function Overrides FieldDefinitionInterface::isTranslatable
FieldDefinition::setDefaultValue public function Set a default value for the field.
FieldDefinition::setDefaultValueCallback public function Set the default value callback for the field.
FieldDefinition::setDisplayConfigurable public function Sets whether the display for the field can be configured.
FieldDefinition::setDisplayOptions public function Sets the display options for the field in forms or rendered entities.
FieldDefinition::setFieldStorageDefinition public function Set the field storage definition.
FieldDefinition::setSetting public function Overrides DataDefinition::setSetting
FieldDefinition::setSettings public function Overrides DataDefinition::setSettings
FieldDefinition::setTargetBundle public function Set the target bundle.
FieldDefinition::setTranslatable public function Sets whether the field is translatable.
FieldInputValueNormalizerTrait::normalizeValue protected static function Ensure a field value is transformed into a format keyed by delta.
ListDataDefinition::$itemDefinition protected property The data definition of a list item.
ListDataDefinition::create public static function Creates a new list definition. Overrides DataDefinition::create 1
ListDataDefinition::createFromDataType public static function Overrides DataDefinition::createFromDataType
ListDataDefinition::createFromItemType public static function Overrides ListDataDefinitionInterface::createFromItemType 1
ListDataDefinition::getClass public function Overrides DataDefinition::getClass
ListDataDefinition::getDataType public function Overrides DataDefinition::getDataType 1
ListDataDefinition::getItemDefinition public function Overrides ListDataDefinitionInterface::getItemDefinition
ListDataDefinition::setDataType public function Overrides DataDefinition::setDataType
ListDataDefinition::setItemDefinition public function Sets the item definition.
ListDataDefinition::__clone public function Magic method: Implements a deep clone. 1
ListDataDefinition::__construct public function Overrides DataDefinition::__construct
TypedDataTrait::$typedDataManager protected property The typed data manager used for creating the data types.
TypedDataTrait::getTypedDataManager public function Gets the typed data manager. 2
TypedDataTrait::setTypedDataManager public function Sets the typed data manager. 2
UnchangingCacheableDependencyTrait::getCacheContexts public function 1
UnchangingCacheableDependencyTrait::getCacheMaxAge public function 3
UnchangingCacheableDependencyTrait::getCacheTags public function 1

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