web-dev-qa-db-ja.com

段落をフェッチするためのgetValue()とreferenceEntities()の違いは何ですか?

ノードの段落を取得するためのgetValue()referencedEntities()の使用の違いは何ですか?

以下の例を参照してください。どちらの例も、_node--page--full.html.twig_およびmymodule_preprocess_node()フックなどのノードテンプレートで使用されます。

getValue()を使用する

_$paragraph = $node->field_paragraph->getValue();
foreach ( $paragraph as $pr ) {
  // Get the entity using Paragraph::load(entity_id).
  $pr_item = \Drupal\paragraphs\Entity\Paragraph::load($pr['target_id']);

  // Now use $pr_item to get any field.
  $pr_item_img = $pr_item->field_image;
}
_

referencedEntities()を使用する

_$pr_field = $node->field_paragraph->referencedEntities();
foreach($pr_field as $pr) {
  $item_image = $pr->get('field_image');
}
_

主に次のことに関心があります。

  1. より高性能なものは何ですか?
  2. 両方が機能するため、ベストプラクティスは何ですか?
  3. どちらの方法も魔法の方法と考えられていますか? $node->get('field_paragraph')ではなく_$node->field_paragraph_を使用できるため、お願いします
2
usernameabc

パフォーマンス

EntityReferenceFieldItemList :: referencedEntities は、エンティティを個別にロードする代わりにloadMultiple()を使用するため、パフォーマンスが向上します。

ベストプラクティス

静的コードを使用してエンティティをロードしますが、可能であれば回避する必要があります。適切なOOPコードを作成することもできますが、ホイールを再発明しないこともベストプラクティスです。

編集:これはノードの前処理にある情報を追加しました。次に、ノードテンプレート_{{ content.field_paragraph }}_で段落フィールドをレンダリングすることをお勧めします。 UIでフィールドを構成します。たとえば、カスタムビューモードを追加します。この特定のフィールドまたはビューモードのフィールドテンプレートと段落テンプレートの出力にテーマを設定します。

魔法の方法

いいえ、これには魔法のメソッドは含まれていません。メソッドは直接呼び出されます。マジックメソッドは、_$node->field_paragraph_で述べた例のように、エンティティフィールドをオブジェクトプロパティのように取得することに関与しています。

翻訳

翻訳されたフィールド値を直接出力する前に、両方のメソッドのエンティティを翻訳する必要があります。

_$paragraph = \Drupal::service('entity.repository')
  ->getTranslationFromContext($paragraph, $langcode);
_

ちなみに、コアはエンティティ参照フィールドフォーマッターを使用してレンダリングされた出力を作成するときに、後でエンティティを変換します。これは、通常はフィールド値を直接出力しないため、コアに対して機能します。これは、悪い習慣と見なすこともできます。たとえば、今日のこの質問を参照してください Twig? の段落バンドル内にある.html.twigファイル。

改訂

段落はEntityReferenceRevisionsフィールドに格納されます。サンプルコードはリビジョンデータを無視するため、間違ったバージョンをロードする可能性があります。単一のエンティティーをロードする必要がある場合に備えて、フィールドで提供されるメソッドreferencedEntities()または_$item->entity_を使用するもう1つの理由。

2
4k4