Tipos de Entidad
- Drupal 7: las entidades eran objetos generales stdClass.
- Drupal 8: las entidades ahora son objetos con tipificaci贸n espec铆fica, donde cada tipo de entidad define una clase que se usar谩 para las instancias de esa entidad.
Requisitos
Las clases de Entidad deben estar ubicadas en el subespacio de nombres Entity del m贸dulo que provee el tipo de entidad, por ejemplo \Drupal\[nombre_del_m贸dulo]\Entity. Esto significa que los archivos PHP de las clases Entity se encuentran en el directorio src/Entity dentro del m贸dulo.
El docblock para la clase debe contener la anotaci贸n EntityType, que define los metadatos para la entidad de ese tipo. Estos incluyen cosas como la etiqueta del tipo de entidad, controladores, tablas, etc. Para una lista documentada de todas las propiedades de metadatos disponibles, consulte la clase \Drupal\Core\Entity\Annotation\EntityType.
Nombrado
Los nombres de los tipos de objeto deben tener un prefijo con el nombre del m贸dulo, si el tipo de objeto y el nombre del m贸dulo no coinciden. No es necesario prefijar el nombre de la clase del tipo de entidad, ya que est谩 en el espacio de nombres del m贸dulo que lo define, siempre que este nombre sea suficientemente descriptivo por s铆 mismo. Por ejemplo, el tipo de entidad para t茅rminos de taxonom铆a se llama taxonomy_term, y el nombre de la clase es Drupal\taxonomy\Entity\Term.
Interfaces
Drupal 8 recomienda usar hints y m茅todos con interfaces en lugar de clases concretas. Por ejemplo, el almacenamiento gen茅rico de entidades intercepta el hint de tipo con EntityInterface, como en hook_entity_insert (EntityInterface $entity), mientras que el almacenamiento espec铆fico para nodos intercepta el hint de tipo con NodeInterface, como en hook_node_insert (NodeInterface $node).
Los campos/propiedades de una Entidad suelen ser muy cortos, orientados a almacenamiento y no muy descriptivos. Adem谩s, las entidades de contenido generalmente no usan propiedades espec铆ficas para sus campos (incluyendo campos base como el t铆tulo del nodo).
Por lo tanto, el enfoque recomendado es proporcionar una interfaz con m茅todos documentados. Algunas reglas a seguir:
- Los m茅todos usualmente tienen prefijos get/set/is o similares: getAlgo(), setAlgo($valor), isAlgo().
- Solo agregue m茅todos para cosas que otro c贸digo necesite modificar. Por ejemplo, la fecha de 煤ltima modificaci贸n de nodos ($node->updated) no debe modificarse, por lo que hay un m茅todo $node->getChangedTime(), pero no $node->setChangedTime().
- Use nombres de m茅todos autoexplicativos; por ejemplo, el m茅todo para acceder al estado $node->status es $node->isPublished().
Claridad
Para saber qu茅 tipos de entidad provee un m贸dulo, revise las clases en el subespacio de nombres Entity de ese m贸dulo que tengan la anotaci贸n @EntityType, que tambi茅n contiene el nombre en la clave id de la anotaci贸n.
Para encontrar d贸nde est谩 definido un tipo de entidad dado, lo primero que debe buscar es el prefijo del tipo de entidad. Si el m贸dulo no sigue esta convenci贸n de nombres, puede buscar por id = "$type". Si se conoce la clase o interfaz en lugar del tipo de entidad, el espacio de nombres indica de d贸nde proviene.
Ejemplo
core/modules/node/src/Entity/Node.php:
namespace Drupal\node\Entity;
use Drupal\Core\Entity\ContentEntityBase;
use Drupal\Core\Entity\EntityChangedTrait;
use Drupal\Core\Entity\EntityStorageInterface;
use Drupal\Core\Entity\EntityTypeInterface;
use Drupal\Core\Field\BaseFieldDefinition;
use Drupal\Core\Session\AccountInterface;
use Drupal\node\NodeInterface;
use Drupal\user\UserInterface;
/**
* Defines the node entity class.
*
* @ContentEntityType(
* id = "node",
* label = @Translation("Content"),
* bundle_label = @Translation("Content type"),
* handlers = {
* "storage" = "Drupal\node\NodeStorage",
* "storage_schema" = "Drupal\node\NodeStorageSchema",
* "view_builder" = "Drupal\node\NodeViewBuilder",
* "access" = "Drupal\node\NodeAccessControlHandler",
* "views_data" = "Drupal\node\NodeViewsData",
* "form" = {
* "default" = "Drupal\node\NodeForm",
* "delete" = "Drupal\node\Form\NodeDeleteForm",
* "edit" = "Drupal\node\NodeForm"
* },
* "route_provider" = {
* "html" = "Drupal\node\Entity\NodeRouteProvider",
* },
* "list_builder" = "Drupal\node\NodeListBuilder",
* "translation" = "Drupal\node\NodeTranslationHandler"
* },
* base_table = "node",
* data_table = "node_field_data",
* revision_table = "node_revision",
* revision_data_table = "node_field_revision",
* translatable = TRUE,
* list_cache_contexts = { "user.node_grants:view" },
* entity_keys = {
* "id" = "nid",
* "revision" = "vid",
* "bundle" = "type",
* "label" = "title",
* "langcode" = "langcode",
* "uuid" = "uuid",
* "status" = "status",
* "uid" = "uid",
* },
* bundle_entity_type = "node_type",
* field_ui_base_route = "entity.node_type.edit_form",
* common_reference_target = TRUE,
* permission_granularity = "bundle",
* links = {
* "canonical" = "/node/{node}",
* "delete-form" = "/node/{node}/delete",
* "edit-form" = "/node/{node}/edit",
* "version-history" = "/node/{node}/revisions",
* "revision" = "/node/{node}/revisions/{node_revision}/view",
* }
* )
*/
class Node extends ContentEntityBase implements NodeInterface {
// ...
}
Para obtener una visi贸n completa de las entidades en Drupal 8, podemos considerar el siguiente diagrama. Este representa las clases de entidad. Para verlo, 谩bralo en una nueva pesta帽a:
