Trong Drupal 8, bạn có thể tải một thực thể với:
$node = \Drupal::entityManager()->getStorage('node')->load(123);
Cái này tìm các định nghĩa thực thể và thấy rằng nút đó được xác định bởi Drupal \ node \ Entity \ Node - vì vậy (tôi đoán) Drupal \ node \ NodeStorage sẽ khởi tạo một thể hiện Drupal \ node \ Entity \ Node mới .
Những gì tôi muốn đạt được là phân lớp Drupal \ node \ Entity \ Node và có thể khởi tạo lớp con này khi thích hợp. Ví dụ: nếu tôi có một bài viết gói nút, sẽ có một lớp:
namespace Drupal\my_module\Entity\Article;
class Article extends Drupal\node\Entity\Node {
}
Và tôi sẽ gọi:
$node = \Drupal::entityManager()->getStorage('node_article')->load(123);
Và sự trở lại sẽ là Article
lớp con của tôi .
Tôi có thể đạt được điều này bằng cách tạo một loại thực thể mới và nối nó lại với các định nghĩa thực thể hiện có khác, ví dụ ví dụ về bài viết nút sẽ là lớp này:
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);
Điều này hoạt động tốt (nhiều như tôi có thể thấy); Tuy nhiên, nó có mùi. Nó thêm một loại thực thể mới, không đúng sự thật và có thể gây ra những rắc rối khác trong tương lai.
Làm cách nào để xác định một lớp con cho gói thực thể để tải thực thể sẽ trả về một đối tượng của lớp đó?
hook_entity_type_alter()
để thực hiện thay đổi rõ ràng hơn, nhưng tôi không biết làm thế nào bạn giới hạn điều đó với một gói cụ thể