受け入れられた回答は、特にノードエンティティに適用されますが、すべてのエンティティにはバンドルがあります。user
またはmenu_link_content
(カスタムメニューリンク用)などの多くのエンティティには、エンティティタイプ自体に対応するバンドルが1つしかありません。
entity_type.bundle.info
実装されたサービス、Drupalは\コア\エンティティ\ EntityTypeBundleInfoは、エンティティバンドル情報へのアクセスを提供します。そのメソッドはgetAllBundleInfo()
、getBundleInfo($entity_type_id)
エンティティタイプとバンドルマシン名をそれぞれキーとする配列を返し、前者はバンドルマシン名をキーとするバンドルの配列を含みます。各バンドルにはlabel
、翻訳されたバンドルのフレンドリ名を持つキーがあります。
以下は、コンテンツエンティティのマシン名、ラベル、バンドルマシン名、およびバンドルラベルの違いを示す例です。コードは、IDが1つ以上のカスタムメニューリンクがあることを前提としています1
。また、article
ノードタイプ(バンドル)があり、IDが1つ以上のノードがあり、ノードがノードタイプ(バンドル)であると想定1
していますarticle
。
<?php
$entity_type_manager = \Drupal::entityTypeManager();
$bundle_info = \Drupal::service("entity_type.bundle.info")->getAllBundleInfo();
$current_user = \Drupal::currentUser()->getAccount();
// Prints "user".
print $current_user->getEntityTypeId() . PHP_EOL;
// Prints "User".
print $current_user->getEntityType()->getLabel() . PHP_EOL;
// Prints "user".
print $current_user->bundle() . PHP_EOL;
// Prints "User".
print $bundle_info[$current_user->getEntityTypeId()][$current_user->bundle()]['label'] . PHP_EOL;
$my_menu_link = $entity_type_manager->getStorage('menu_link_content')->load(1);
// Prints "menu_link_content".
print $my_menu_link->getEntityTypeId() . PHP_EOL;
// Prints "Custom menu link".
print $my_menu_link->getEntityType()->getLabel() . PHP_EOL;
// Prints "menu_link_content".
print $my_menu_link->bundle() . PHP_EOL;
// Prints "Custom menu link".
print $bundle_info[$my_menu_link->getEntityTypeId()][$my_menu_link->bundle()]['label'] . PHP_EOL;
$my_article = $entity_type_manager->getStorage('node')->load(1);
// Prints "node".
print $my_article->getEntityTypeId() . PHP_EOL;
// Prints "Content".
print $my_article->getEntityType()->getLabel() . PHP_EOL;
// Prints "article".
print $my_article->bundle() . PHP_EOL;
// Prints "Article".
print $bundle_info[$my_article->getEntityTypeId()][$my_article->bundle()]['label'] . PHP_EOL;
クラスの静的メソッドに依存するのではなく、コード内で可能な限り依存性注入を使用してくださいDrupal
。