it-swarm-ja.com

entity_metadata_wrapper()関数の目的は何ですか、なぜそれを使用する必要があるのですか?

私は現在 Entity API を使用する多くのモジュールへのアドオンを開発しているようで、entity_metadata_wrapper()関数がポップアップし続けます。

ドキュメントページ はこれについて次のように述べています:

指定されたデータのプロパティラッパーを返します。

エンティティがラップされている場合、ラッパーを使用してエンティティプロパティのラッパーをさらに取得できます。

そこにある「エンティティ」という単語の素晴らしいフロイト語のスペルを無視すると、これらのラッパーの目的が何であるかは本当にわかりません。

私は関数が本質的に EntityDrupalWrapper クラスを返すことを理解しています:

ラッパーは、エンティティプロパティのゲッターコールバックとセッターコールバックの適用を容易にします

しかし、私が理解できないのはどのように簡単にできるかです。

たとえば、ノードのステータスプロパティを更新するには、次のコードを使用できます。

_$node = node_load($nid);
$node->status = 1;
node_save($node);
_

それはかなりきれいです。私が理解しているように(ただし、間違っている可能性があります)、entity_metadata_wrapper()を使用する同等のコードは、それよりも冗長になります。

ここで私を混乱させるのが単に「ラッパー」という用語の使用なのかどうかはわかりませんが、Entityモジュールのコードも調べましたが、実際にはあまり理解できていません。

この関数を使用することの利点を説明でき、一般的なユースケースの簡単なコード例を提供できる人はいますか?

22
Clive

はい、ノードのステータスの変更はハードコードされたプロパティであるため、簡単です。

一方、フィールドははるかに複雑です。それらは3レベルの深さにネストされていますが、正しい言語で取得するための field_get_items() がありますが、フィールド値を設定するためのそのような関数はありません。したがって、常に フィールドが翻訳可能かどうかを確認 する必要があり、どのプロパティに設定したい、または設定したい値が正確に含まれているかを知る必要があります。

エンティティラッパーが実行できることを示す2つの例:

  • 次の行は、次の回答から引用した言語と参照IDを保持する実際のプロパティを処理して、コマース広告申込情報を注文に追加します https://drupal.stackexchange.com/a/23513/ 31

    $order_wrapper->commerce_line_items[] = $line_item;
    
  • 同様に、言語やデルタをチェックする必要なく、フィールドの値に直接アクセスでき、参照されたエンティティに直接アクセスできます https://drupal.stackexchange。 com/a/33010/31

    $subnode = entity_metadata_wrapper('node', $node)->field_subnode->value();
    $default = $subnode->title;
    

エンティティラッパーは、 Search APIRules のような柔軟で強力なモジュールを推進する原動力であり、複数のレベルの参照を処理できるため、たとえばユーザーが[commerce-order:commerce-line-items:0:commerce-product:some-field]のようなもの(実際には正しくないかもしれませんが、そのようなもの)でユーザーが購入した製品のフィールドにアクセスするか、参照されたノードの本文の要約を検索インデックスに追加します。

とは言っても、ラッパーの実際のAPIは必ずしも好きではありません。巨大な内部配列であり、単純なプロパティでさえラッパークラスです。 Drupal 8)の改良されたエンティティ(およびうまくいけばフィールド)システムが、クラス化されたエンティティのおかげでそのようなラッパーの必要性を取り除くことを願っています。

23
Berdir