In Drupal 8 können Sie eine Entität laden mit:
$node = \Drupal::entityManager()->getStorage('node')->load(123);
Dies sucht nach den Entitätsdefinitionen und stellt fest, dass der Knoten durch Drupal \ node \ Entity \ Node definiert ist. Drupal \ node \ NodeStorage instanziiert also (glaube ich) eine neue Drupal \ node \ Entity \ Node- Instanz.
Was ich erreichen möchte, ist die Unterklasse Drupal \ node \ Entity \ Node und die Möglichkeit, diese Unterklasse zu instanziieren, wenn es angebracht ist. Wenn ich beispielsweise einen Artikel zum Knotenpaket habe, gibt es eine Klasse:
namespace Drupal\my_module\Entity\Article;
class Article extends Drupal\node\Entity\Node {
}
Und ich würde anrufen:
$node = \Drupal::entityManager()->getStorage('node_article')->load(123);
Und die Rückkehr wäre meine Article
Unterklasse.
Ich kann dies erreichen, indem ich einen neuen Entitätstyp erstelle und ihn mit anderen vorhandenen Entitätsdefinitionen verdrahtete. Das Beispiel für einen Knotenartikel wäre beispielsweise diese Klasse:
namespace Drupal\my_module\Entity;
use Drupal\node\Entity\Node;
/**
* @ContentEntityType(
* id = "node_article",
* 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 Article extends Node { }
// Results my Article sub type.
$node = \Drupal::entityManager()->getStorage('node_article')->load(123);
Das funktioniert gut (so viel ich sehen kann); es riecht jedoch. Es wird ein neuer Entitätstyp hinzugefügt, der nicht wahr ist und in Zukunft andere Probleme verursachen kann.
Wie definiere ich eine Unterklasse für ein Entitätspaket, damit beim Laden der Entität ein Objekt dieser Klasse zurückgegeben wird?
hook_entity_type_alter()
, um die Änderung sauberer zu machen, aber ich weiß nicht, wie Sie das auf ein bestimmtes Bundle beschränken würden