child_entity
5 sites
Security covered
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;
}