This module allows you to create entities that are dependent on a parent entity, meaning they can only exist in relation to a specific parent. For example, a "room" entity might always belong to a "house" entity. It provides traits and interfaces to easily implement this parent-child relationship in your custom entities.
This module helps you to create Entities which creating them depends on a parent entity.
Consider a Room in a House. The Room can only every be in one house. In this example Room is child and House is parent entity.
In order to use this module you have to:
- Implement ChildEntityInterface or extend it
- Use Child Entity Handlers, either directly in the Entity definition or extending them.
- Define
parentkey inentity_keyssection of the child entity annotation and useChildEntityTrait - Add
childBaseFieldDefinitions
This works in the same way as core's EntityOwnerTrait.
/**
************ other configuration ************
* handlers = {
* "list_builder" = "Drupal\child_entity\ChildEntityListBuilder",
* "views_data" = "Drupal\child_entity\ChildEntityViewsData",
* "form" = {
* "default" = "Drupal\child_entity\Form\ChildEntityForm",
* },
* "route_provider" = {
* "html" = "Drupal\child_entity\Routing\ChildEntityHtmlRouteProvider",
* },
* "access" = "Drupal\child_entity\ChildEntityAccessControlHandler",
* entity_keys = {
* "parent" = "house",
* },
************ other configuration ************
*/
class Room extends ContentEntityBase implements ChildEntityInterface {
use ChildEntityTrait;
/**
* {@inheritdoc}
*/
public static function baseFieldDefinitions(EntityTypeInterface $entity_type) {
$fields = parent::baseFieldDefinitions($entity_type);
$fields += static::childBaseFieldDefinitions($entity_type);
return $fields;
}
}
Revision-able Entities and urlRouteParameters()
If your entity type also has revisions you may be overriding the urlRouteParameters() but you need to specify to use the one from the trait:
use ChildEntityTrait {
urlRouteParameters as childEntityUrlRouteParameters;
}
/**
* {@inheritdoc}
* @throws \Drupal\Component\Plugin\Exception\PluginNotFoundException
*/
protected function urlRouteParameters($rel) {
$uri_route_parameters = $this->childEntityUrlRouteParameters($rel);
if ($rel === 'revision_revert' && $this instanceof RevisionableInterface) {
$uri_route_parameters[$this->getEntityTypeId() . '_revision'] = $this->getRevisionId();
}
elseif ($rel === 'revision_delete' && $this instanceof RevisionableInterface) {
$uri_route_parameters[$this->getEntityTypeId() . '_revision'] = $this->getRevisionId();
}
return $uri_route_parameters;
}
Version 1
Version 1 of this module implemented Base classes that can be extended however this has limitations and version 2 uses Traits which allows the following:
class ChildNode extends Node implements ChildEntityInterface {
use ChildEntityTrait;
}
Ask your assistant about Child Entity
Check compatibility with your Drupal and PHP version, maintenance and security coverage, from current release data. How it works
Depends on
Dependencies of the latest stable release
Required by
Tracked projects that depend on this one
No tracked projects depend on this one yet.