diff --git a/core/lib/Drupal/Core/Entity/Plugin/Validation/Constraint/ValidReferenceConstraint.php b/core/lib/Drupal/Core/Entity/Plugin/Validation/Constraint/ValidReferenceConstraint.php index d982193..bf8658a 100644 --- a/core/lib/Drupal/Core/Entity/Plugin/Validation/Constraint/ValidReferenceConstraint.php +++ b/core/lib/Drupal/Core/Entity/Plugin/Validation/Constraint/ValidReferenceConstraint.php @@ -28,4 +28,11 @@ class ValidReferenceConstraint extends Constraint { */ public $message = 'The referenced entity (%type: %id) does not exist.'; + /** + * Validation message when the target_id is empty. + * + * @var string + */ + public $nullMessage = 'This value should not be null.'; + } diff --git a/core/lib/Drupal/Core/Entity/Plugin/Validation/Constraint/ValidReferenceConstraintValidator.php b/core/lib/Drupal/Core/Entity/Plugin/Validation/Constraint/ValidReferenceConstraintValidator.php index 6a8f7cd..557d0c9 100644 --- a/core/lib/Drupal/Core/Entity/Plugin/Validation/Constraint/ValidReferenceConstraintValidator.php +++ b/core/lib/Drupal/Core/Entity/Plugin/Validation/Constraint/ValidReferenceConstraintValidator.php @@ -19,6 +19,10 @@ class ValidReferenceConstraintValidator extends ConstraintValidator { * {@inheritdoc} */ public function validate($value, Constraint $constraint) { + if (!$value->isEmpty && $value->target_id === NULL && !$value->entity->isNew()) { + $this->context->addViolation($constraint->nullMessage); + return; + } /* @var \Drupal\Core\Field\FieldItemInterface $value */ if (!isset($value)) { return; diff --git a/core/lib/Drupal/Core/Field/Plugin/Field/FieldType/EntityReferenceItem.php b/core/lib/Drupal/Core/Field/Plugin/Field/FieldType/EntityReferenceItem.php index 3b8cc0e..f456400 100644 --- a/core/lib/Drupal/Core/Field/Plugin/Field/FieldType/EntityReferenceItem.php +++ b/core/lib/Drupal/Core/Field/Plugin/Field/FieldType/EntityReferenceItem.php @@ -33,7 +33,7 @@ * no_ui = TRUE, * default_formatter = "entity_reference_label", * list_class = "\Drupal\Core\Field\EntityReferenceFieldItemList", - * constraints = {"ValidReference" = {}, "EntityReferenceNotNull" = {}} + * constraints = {"ValidReference" = {}} * ) */ class EntityReferenceItem extends FieldItemBase { diff --git a/core/lib/Drupal/Core/TypedData/DataReferenceTargetDefinition.php b/core/lib/Drupal/Core/TypedData/DataReferenceTargetDefinition.php index 4c5d9a4..d97b999 100644 --- a/core/lib/Drupal/Core/TypedData/DataReferenceTargetDefinition.php +++ b/core/lib/Drupal/Core/TypedData/DataReferenceTargetDefinition.php @@ -6,7 +6,18 @@ namespace Drupal\Core\TypedData; - +/** + * A typed data definition class for the entity reference target_id property. + * + * The target_id property differs from other data definitions in that it is + * required at the storage level, but not at the validation level. This is + * because its value can be set just-in-time using the preSave() method. + * + * Validation for the target_id property is provided by the 'ValidReference' + * validation constraint. + * + * @see \Drupal\Core\Field\Plugin\Field\FieldType\EntityReferenceItem::preSave() + */ class DataReferenceTargetDefinition extends DataDefinition { /** @@ -16,12 +27,12 @@ public function getConstraints() { $constraints = parent::getConstraints(); // If this data definition is marked as required for the sake of schema // definitions, we don't enforce it using the NotNull constraint. Instead - // \Drupal\Core\Field\EntityReferenceFieldItemList::getConstraints() adds - // the 'EntityReferenceNotNull' constraint that operates at the field-item - // list level. + // \Drupal\Core\Field\EntityReferenceItem is validated by the + // 'ValidReference' constraint that operates at the field-item level. This + // constraint takes into consideration that the target_id property can + // be derived from the entity property. unset($constraints['NotNull']); return $constraints; } - } diff --git a/core/lib/Drupal/Core/Validation/Plugin/Validation/Constraint/EntityReferenceNotNullConstraint.php b/core/lib/Drupal/Core/Validation/Plugin/Validation/Constraint/EntityReferenceNotNullConstraint.php deleted file mode 100644 index 38d3927..0000000 --- a/core/lib/Drupal/Core/Validation/Plugin/Validation/Constraint/EntityReferenceNotNullConstraint.php +++ /dev/null @@ -1,19 +0,0 @@ -isEmpty && $item->target_id === NULL && !$item->entity->isNew()) { - $this->context->addViolation($constraint->message); - return; - } - } - -}