Field / FieldItem classes need to access their own FieldDefinition.

The waters are muddied by the fact that base fields do not have a FieldDefinition object yet - #2047229: Make use of classes for entity field and data definitions
Configurable fields (ConfigField / ConfigFieldItem) have special code that fetches the FieldDefinition object from config based on the field name & entity type + bundle. There is a hackish workaround to be able to inject a bespoke FieldDefinition ($instance in that case) into the constructor of ConfigField / ConfigFieldItem.

But there are cases where we need that FieldDefinition to not be the "official one stored in code or config":
- use a "variant" of a field definition (e.g non-'required' even if the "real" field is 'required', for "default value" input in Field UI)
- use a field that has been deleted and is not in config anymore (field purge)
- use a field definition that doesn't officially exist yet (Field UI currently has to create the field+instance the moment you submit the first step, and then lets you edit them, instead of creating them after the last step)

Having the objects fetch their FieldDefinitions from the outside, as we well know in D8, is an antipattern, the definitions should be injected into them by the outside code. Typically, it should be the code that creates the Field / FieldItem objects in an entity that reads field definitions from config.

Challenges:
- Field / FieldItem objects are instanciated by the TypedDataFactory, which constrains the arguments of their __construct(). This factory currently injects the "typed data" definition *array* (hook_entity_field_info()), that is way incomplete and is not what the rest of the Field / FieldItem classes use.
- Even if we sort out the factory / instantiation flow to inject a FieldDefinition instead of an array, this will let us create standalone Field / FieldItem objects with a custom FieldDefinition - which is fine -, but still doesn't let us put it in an actual entity. There is currently no way to place an arbitrary Field object in an entity, you can only assign *values* into the Field objects that are already there.

Comments

Berdir’s picture

Issue tags: +Field API, +Entity Field API

Tagging.

Berdir’s picture

I *think* that's at least partially taken care of with #2047229: Make use of classes for entity field and data definitions.

fago’s picture

yes, that's taken care of by the issue for field item lists, but not for field items yet. For field items, the definition of the *item* is injected - what's not the same object as the field definition (= definition of the list of items).

I agree it makes most sense to have the field definition injected - for both, so might want to do it for field items as well. That requires moving instantiation to the field type manager first though.

Berdir’s picture

yched’s picture

Yep, we're probably in a better shape now. Not sure we're fully done though.

The FieldItemList receives its FieldDefinition (= the DataDefinition as a list)
The FieldItem receives its DataDefinition (as a list item), and accesses the FieldDefinition through its parent.

So when faking arbitrary runtime objects, you can do
$field_definition = new FieldDefinition();
$field_definition->Set[ArbitraryProperties]();
$items = new FooFieldItemList($field_definition, NULL, $entity);
$item = ???
Hm - not sure how you'd add new items to the list though. $items->createItem() goes through the TDManager, which will use the "official" definitions from the repository.

Also, the last part of the OP is still unresolved:

Even if we sort out the factory / instantiation flow to inject a FieldDefinition instead of an array, this will let us create standalone Field / FieldItem objects with a custom FieldDefinition - which is fine -, but still doesn't let us put it in an actual entity. There is currently no way to place an arbitrary Field object in an entity, you can only assign *values* into the Field objects that are already there

So the remaining issues are quite similar :
- You can't add an arbitrary, hand-made Item object to an ItemList
- You can't add an arbitrary, hand-made ItemList object to an entity

Version: 8.0.x-dev » 8.1.x-dev

Drupal 8.0.6 was released on April 6 and is the final bugfix release for the Drupal 8.0.x series. Drupal 8.0.x will not receive any further development aside from security fixes. Drupal 8.1.0-rc1 is now available and sites should prepare to update to 8.1.0.

Bug reports should be targeted against the 8.1.x-dev branch from now on, and new development or disruptive changes should be targeted against the 8.2.x-dev branch. For more information see the Drupal 8 minor version schedule and the Allowed changes during the Drupal 8 release cycle.

Version: 8.1.x-dev » 8.2.x-dev

Drupal 8.1.9 was released on September 7 and is the final bugfix release for the Drupal 8.1.x series. Drupal 8.1.x will not receive any further development aside from security fixes. Drupal 8.2.0-rc1 is now available and sites should prepare to upgrade to 8.2.0.

Bug reports should be targeted against the 8.2.x-dev branch from now on, and new development or disruptive changes should be targeted against the 8.3.x-dev branch. For more information see the Drupal 8 minor version schedule and the Allowed changes during the Drupal 8 release cycle.

Version: 8.2.x-dev » 8.3.x-dev

Drupal 8.2.6 was released on February 1, 2017 and is the final full bugfix release for the Drupal 8.2.x series. Drupal 8.2.x will not receive any further development aside from critical and security fixes. Sites should prepare to update to 8.3.0 on April 5, 2017. (Drupal 8.3.0-alpha1 is available for testing.)

Bug reports should be targeted against the 8.3.x-dev branch from now on, and new development or disruptive changes should be targeted against the 8.4.x-dev branch. For more information see the Drupal 8 minor version schedule and the Allowed changes during the Drupal 8 release cycle.

Version: 8.3.x-dev » 8.4.x-dev

Drupal 8.3.6 was released on August 2, 2017 and is the final full bugfix release for the Drupal 8.3.x series. Drupal 8.3.x will not receive any further development aside from critical and security fixes. Sites should prepare to update to 8.4.0 on October 4, 2017. (Drupal 8.4.0-alpha1 is available for testing.)

Bug reports should be targeted against the 8.4.x-dev branch from now on, and new development or disruptive changes should be targeted against the 8.5.x-dev branch. For more information see the Drupal 8 minor version schedule and the Allowed changes during the Drupal 8 release cycle.

Version: 8.4.x-dev » 8.5.x-dev

Drupal 8.4.4 was released on January 3, 2018 and is the final full bugfix release for the Drupal 8.4.x series. Drupal 8.4.x will not receive any further development aside from critical and security fixes. Sites should prepare to update to 8.5.0 on March 7, 2018. (Drupal 8.5.0-alpha1 is available for testing.)

Bug reports should be targeted against the 8.5.x-dev branch from now on, and new development or disruptive changes should be targeted against the 8.6.x-dev branch. For more information see the Drupal 8 minor version schedule and the Allowed changes during the Drupal 8 release cycle.

Version: 8.5.x-dev » 8.6.x-dev

Drupal 8.5.6 was released on August 1, 2018 and is the final bugfix release for the Drupal 8.5.x series. Drupal 8.5.x will not receive any further development aside from security fixes. Sites should prepare to update to 8.6.0 on September 5, 2018. (Drupal 8.6.0-rc1 is available for testing.)

Bug reports should be targeted against the 8.6.x-dev branch from now on, and new development or disruptive changes should be targeted against the 8.7.x-dev branch. For more information see the Drupal 8 minor version schedule and the Allowed changes during the Drupal 8 release cycle.

Version: 8.6.x-dev » 8.8.x-dev

Drupal 8.6.x will not receive any further development aside from security fixes. Bug reports should be targeted against the 8.8.x-dev branch from now on, and new development or disruptive changes should be targeted against the 8.9.x-dev branch. For more information see the Drupal 8 and 9 minor version schedule and the Allowed changes during the Drupal 8 and 9 release cycles.

Version: 8.8.x-dev » 8.9.x-dev

Drupal 8.8.7 was released on June 3, 2020 and is the final full bugfix release for the Drupal 8.8.x series. Drupal 8.8.x will not receive any further development aside from security fixes. Sites should prepare to update to Drupal 8.9.0 or Drupal 9.0.0 for ongoing support.

Bug reports should be targeted against the 8.9.x-dev branch from now on, and new development or disruptive changes should be targeted against the 9.1.x-dev branch. For more information see the Drupal 8 and 9 minor version schedule and the Allowed changes during the Drupal 8 and 9 release cycles.

Version: 8.9.x-dev » 9.2.x-dev

Drupal 8 is end-of-life as of November 17, 2021. There will not be further changes made to Drupal 8. Bugfixes are now made to the 9.3.x and higher branches only. For more information see the Drupal core minor version schedule and the Allowed changes during the Drupal core release cycle.

Version: 9.2.x-dev » 9.3.x-dev

Version: 9.3.x-dev » 9.4.x-dev

Drupal 9.3.15 was released on June 1st, 2022 and is the final full bugfix release for the Drupal 9.3.x series. Drupal 9.3.x will not receive any further development aside from security fixes. Drupal 9 bug reports should be targeted for the 9.4.x-dev branch from now on, and new development or disruptive changes should be targeted for the 9.5.x-dev branch. For more information see the Drupal core minor version schedule and the Allowed changes during the Drupal core release cycle.

Version: 9.4.x-dev » 9.5.x-dev

Drupal 9.4.9 was released on December 7, 2022 and is the final full bugfix release for the Drupal 9.4.x series. Drupal 9.4.x will not receive any further development aside from security fixes. Drupal 9 bug reports should be targeted for the 9.5.x-dev branch from now on, and new development or disruptive changes should be targeted for the 10.1.x-dev branch. For more information see the Drupal core minor version schedule and the Allowed changes during the Drupal core release cycle.

Version: 9.5.x-dev » 11.x-dev

Drupal core is moving towards using a “main” branch. As an interim step, a new 11.x branch has been opened, as Drupal.org infrastructure cannot currently fully support a branch named main. New developments and disruptive changes should now be targeted for the 11.x branch. For more information, see the Drupal core minor version schedule and the Allowed changes during the Drupal core release cycle.