Di Drupal 8 Anda dapat memuat entitas dengan:
$node = \Drupal::entityManager()->getStorage('node')->load(123);
Ini mencari definisi entitas dan menemukan bahwa node didefinisikan oleh Drupal \ node \ Entity \ Node - jadi (saya kira) Drupal \ node \ NodeStorage akan instantiate contoh Drupal \ node \ Entity \ Node yang baru .
Apa yang ingin saya capai adalah subkelas Drupal \ node \ Entity \ Node dan dapat membuat instance subkelas ini ketika itu sesuai. Sebagai contoh jika saya memiliki artikel kumpulan simpul, akan ada kelas:
namespace Drupal\my_module\Entity\Article;
class Article extends Drupal\node\Entity\Node {
}
Dan saya akan menelepon:
$node = \Drupal::entityManager()->getStorage('node_article')->load(123);
Dan kembalinya akan menjadi Article
subclass saya .
Saya bisa mencapai ini dengan membuat tipe entitas baru dan menghubungkannya kembali ke definisi entitas lain yang sudah ada, misalnya contoh node-article adalah kelas ini:
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);
Ini berfungsi dengan baik (sebanyak yang saya bisa lihat); Namun, baunya. Itu menambahkan tipe entitas baru, yang tidak benar, dan mungkin menyebabkan masalah lain di masa depan.
Bagaimana cara mendefinisikan subclass untuk bundel entitas sehingga memuat entitas akan mengembalikan objek kelas itu?
hook_entity_type_alter()
untuk membuat perubahan lebih bersih, tapi saya tidak tahu bagaimana Anda akan membatasi itu pada bundel tertentu