Architecture & Plugin System
When to Use
You need to understand how Custom Field's plugin system works to extend it with custom field types, widgets, or formatters, or to debug plugin discovery issues.
Pattern
Three custom plugin managers (defined in custom_field.services.yml):
plugin.manager.custom_field_type:
class: Drupal\custom_field\Plugin\CustomFieldTypeManager
# Discovers #[CustomFieldType] plugins in /Plugin/CustomField/FieldType/
plugin.manager.custom_field_widget:
class: Drupal\custom_field\Plugin\CustomFieldWidgetManager
# Discovers #[CustomFieldWidget] plugins in /Plugin/CustomField/FieldWidget/
plugin.manager.custom_field_formatter:
class: Drupal\custom_field\Plugin\CustomFieldFormatterManager
# Discovers #[CustomFieldFormatter] plugins in /Plugin/CustomField/FieldFormatter/
Main field type: CustomItem (plugin ID custom) -- single field type with dynamic columns defined via settings. Uses CustomItemList as list class.
Column separator constant: CustomItem::SEPARATOR = '__' -- used for extended properties like image__alt, link__title.
Key services:
plugin.manager.custom_field_type-- FieldType plugin managerplugin.manager.custom_field_widget-- Widget plugin managerplugin.manager.custom_field_formatter-- Formatter plugin managercustom_field.update_manager-- Handles schema updates for existing fieldscustom_field.generate_data-- Generates sample data
Hook classes (Drupal 11 style):
GeneralHooks-- General hooksFormHooks-- Form alterationsThemeHooks-- Theme preprocessingTokenHooks-- Token definitionsViewsHooks-- Views integration
Common Mistakes
- Calling plugin managers statically -- Inject via dependency injection, don't use
\Drupal::service()in classes - Assuming core field plugin discovery -- Custom Field has its own plugin namespaces under
/Plugin/CustomField/, not/Plugin/Field/ - Not clearing cache after adding plugins -- Plugin definitions are cached; run
drush crafter creating new plugins
See Also
- Reference:
/modules/contrib/custom_field/src/Plugin/CustomFieldTypeManager.php - Reference:
/modules/contrib/custom_field/custom_field.services.yml