diff --git a/core/lib/Drupal/Core/Field/BaseFieldDefinition.php b/core/lib/Drupal/Core/Field/BaseFieldDefinition.php index e28d9975b492c2260f37888d2276e251c5e23f71..2ff671613ee05f54dc6c4f6082026abbe618aeff 100644 --- a/core/lib/Drupal/Core/Field/BaseFieldDefinition.php +++ b/core/lib/Drupal/Core/Field/BaseFieldDefinition.php @@ -12,7 +12,7 @@ /** * A class for defining entity fields. */ -class BaseFieldDefinition extends ListDataDefinition implements FieldDefinitionInterface, FieldStorageDefinitionInterface { +class BaseFieldDefinition extends ListDataDefinition implements FieldDefinitionInterface, FieldStorageDefinitionInterface, RequiredFieldStorageDefinitionInterface { use UnchangingCacheableDependencyTrait; @@ -723,4 +723,30 @@ public function getConfig($bundle) { return BaseFieldOverride::createFromBaseFieldDefinition($this, $bundle); } + /** + * {@inheritdoc} + */ + public function isStorageRequired() { + if (isset($this->definition['storage_required'])) { + return (bool) $this->definition['storage_required']; + } + + // Default to the 'required' property of the base field. + return $this->isRequired(); + } + + /** + * Sets whether the field storage is required. + * + * @param bool $required + * Whether the field storage is required. + * + * @return static + * The object itself for chaining. + */ + public function setStorageRequired($required) { + $this->definition['storage_required'] = $required; + return $this; + } + } diff --git a/core/lib/Drupal/Core/Field/RequiredFieldStorageDefinitionInterface.php b/core/lib/Drupal/Core/Field/RequiredFieldStorageDefinitionInterface.php new file mode 100644 index 0000000000000000000000000000000000000000..d29e56907eb98c56232578b70b04abe9697ea870 --- /dev/null +++ b/core/lib/Drupal/Core/Field/RequiredFieldStorageDefinitionInterface.php @@ -0,0 +1,21 @@ +<?php + +namespace Drupal\Core\Field; + +/** + * Defines an interface for required field storage definitions. + */ +interface RequiredFieldStorageDefinitionInterface { + + /** + * Returns whether the field storage is required. + * + * If a field storage is required, NOT NULL constraints will be added + * automatically for the required properties of a field type. + * + * @return bool + * TRUE if the field storage is required, FALSE otherwise. + */ + public function isStorageRequired(); + +} diff --git a/core/tests/Drupal/Tests/Core/Entity/BaseFieldDefinitionTest.php b/core/tests/Drupal/Tests/Core/Entity/BaseFieldDefinitionTest.php index dbd50e795ef8e563a7e72b358b8369667742fb35..bb4668306b4371b7d4291a0fb8bbae2bde69e1fb 100644 --- a/core/tests/Drupal/Tests/Core/Entity/BaseFieldDefinitionTest.php +++ b/core/tests/Drupal/Tests/Core/Entity/BaseFieldDefinitionTest.php @@ -254,6 +254,21 @@ public function testFieldRequired() { $this->assertFalse($definition->isRequired()); } + /** + * Tests storage required. + * + * @covers ::isStorageRequired + * @covers ::setStorageRequired + */ + public function testFieldStorageRequired() { + $definition = BaseFieldDefinition::create($this->fieldType); + $this->assertFalse($definition->isStorageRequired()); + $definition->setStorageRequired(TRUE); + $this->assertTrue($definition->isStorageRequired()); + $definition->setStorageRequired(FALSE); + $this->assertFalse($definition->isStorageRequired()); + } + /** * Tests provider. *