テーマ設定レイヤーでエンティティ値にアクセスするためのさまざまなアプローチを見てきました。以下のコードは、マジックメソッドを使用した簡単な例です。すべての値が設定されていることを前提としています。その一部がNULLを返す場合、私の経験ではエラーが発生します。
_$value = $node->field_paragraph
->entity->field_media
->entity->field_file
->entity->field_text->value;
_
_->hasField
_や->count()
のようなものをチェックするためのメソッドがあり、私のテーマにはさまざまなものがあります。私は仕事を成し遂げることができますが、時々それは醜く感じます。開発者がエンティティ参照を安全かつエレガントにドリルスルーするために使用するコーディングパターンに興味があります。
提案、ロジックを持つドメインオブジェクトを作成します。
通常、これらのエンティティは、ビジネスドメインに適合するものを表します。
たとえば、インスタンスでは、ノードはイベントである可能性があります。
したがって、EventWrapper
というドメインオブジェクトをモデル化できます。
<?php
namespace Drupal\my_domain;
use Drupal\node\NodeInterface;
use Drupal\media\MediaInterface;
use Drupal\file\FileInterface;
class EventWrapper {
protected $node;
public static function fromNode(NodeInterface $node): EventWrapper {
$instance = new static();
$instance->node = $node;
return $instance;
}
public function getMedia() : ?MediaInterface {
if ($this->node->hasField('field_media') && !$this->node->get('field_media')->isEmpty()) {
return $this->node->field_media->entity;
}
return NULL;
}
public function getMediaImage() : ?FileInterface {
if (($media = this->getMedia()) && $media->hasField('field_file') && !$media->get('field_file')->isEmpty()) {
return $media->field_file->entity;
}
return NULL;
}
public function getImageCaption(): ?string {
if (($file = this->getMediaImage()) && $file->hasField('field_text') && !$file->get('field_text')->isEmpty()) {
return $file->field_text->value;
}
return NULL;
}
}
次に、コードで:
<?php
$image_caption = EventWrapper::fromNode($node)->getImageCaption();
通常は段落を再帰的にレンダリングしますが、固定構造をforeachループで再作成することにより、非再帰的に取得できます。
foreach ($node->field_paragraph->referencedEntities() as $paragraph) {
foreach ($paragraph->field_media->referencedEntities() as $media) {
...
}
}
これにより、空のフィールドへのアクセスが回避され、複数値フィールドを処理できます。