it-swarm.com.de

Sichere und elegante Möglichkeit, über Felder auf verschachtelte Entitäten zuzugreifen

Ich habe verschiedene Ansätze für den Zugriff auf Entitätswerte in der Themenebene gesehen. Der folgende Code ist nur ein einfaches Beispiel mit magischen Methoden. Es wird davon ausgegangen, dass alle Werte festgelegt sind. Wenn ein Teil davon NULL zurückgibt, treten meiner Erfahrung nach Fehler auf.

$value = $node->field_paragraph
    ->entity->field_media
    ->entity->field_file
    ->entity->field_text->value;

Es gibt Methoden wie ->hasField Und ->count(), um Dinge zu überprüfen, und ich habe eine Vielzahl in meinen Themen. Ich kann den Job erledigen, aber manchmal fühlt es sich hässlich an. Ich interessiere mich für die Codierungsmuster, mit denen Entwickler Entitätsreferenzen sicher und elegant durchforsten.

7
simesy

Vorschlag: Erstellen Sie ein Domänenobjekt mit der Logik.

Normalerweise stellen diese Entitäten etwas dar, das zu Ihrer Geschäftsdomäne passt.

In Ihrer Instanz kann der Knoten beispielsweise ein Ereignis sein.

Sie können also ein Domänenobjekt mit dem Namen EventWrapper modellieren.

<?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;
  }
}

Dann in Ihrem Code:

<?php

$image_caption = EventWrapper::fromNode($node)->getImageCaption();
7
larowlan

Obwohl Sie Absätze normalerweise rekursiv rendern, können Sie eine feste Struktur nicht rekursiv abrufen, indem Sie sie mit foreach-Schleifen neu erstellen:

foreach ($node->field_paragraph->referencedEntities() as $paragraph) {
  foreach ($paragraph->field_media->referencedEntities() as $media) {
    ...
  }
}

Dies vermeidet den Zugriff auf leere Felder und kann mehrwertige Felder verarbeiten.

5
4k4