Рейтинг:0

Рекомендации по получению значений полей цепочек сущностей

флаг cn

Я действительно хотел бы сделать эту проверку значения поля if/else немного более привлекательной.

Как лучше всего обращаться с цепочками вложенных функций для получения значений поля сущности (проверьте, существуют ли они/проверьте, не пусты ли они)

 if($entity->hasField('field_intro_teaser_image_media_')){
      $media_field = $entity->field_intro_teaser_image_media_;

      если ($ media_field-> сущность) {
        $media_field_entity = $media_field->сущность;

        если($media_field_entity->hasField('field_media_image')){
          $media_field_entity_image = $media_field_entity->field_media_image;

          если ($ media_field_entity_image) {
            $media_field_entity_image_entity = $media_field_entity_image->сущность;

            если ($ media_field_entity_image_entity) {
              $media_field_entity_image_entity_uri = $media_field_entity_image->entity->getFileUri();

              если($media_field_entity_image_entity_uri){

                // ... ура, у нас есть проклятый uri!

              }

            }
          }
        }
      }
    }

Один вкладыш будет:

$media_field = $entity->field_intro_teaser_image_media_->entity->field_media_image->entity->getFileUri();



  
флаг cn
Еще не пробовал это на полях сущностей, но [нулевой безопасный оператор] (https://php.watch/versions/8.0/null-safe-operator)?
Kevin avatar
флаг in
Один лайнер потерпит неудачу, если что-то в цепочке не имеет поля или реляционной сущности, поэтому вам нужно обернуть его в оператор try catch.
4uk4 avatar
флаг cn
Или используйте Twig, см. https://drupal.stackexchange.com/questions/271579/get-video-url-from-media-entity-reference-field. Twig по умолчанию безопасен для null, если вы не установите strict_variables.
Рейтинг:1
флаг us

Когда вы получаете доступ к полям магическими методами, вам фактически не нужно проверять их существование с помощью hasField() метод.:

$entity->field_that_does_not_exist->entity; // НОЛЬ.
$entity->get('field_that_does_not_exist'); // Исключение.
$entity->get('field_that_does_not_exist')->entity; // Исключение.

С использованием $entity->field_intro_teaser_image_media_->entity в этом случае достаточно, если поле не существует, выражение будет просто НОЛЬ, без ошибок.

Но, конечно, вы все равно должны проверить, ссылаются ли -> сущность не является НОЛЬ. Оператор PHP 8.0 Null-safe может быть способом сделать это, как это было предложено Клайв.

$media_field = $сущность
  ->field_intro_teaser_image_media_
  -> сущность
  ?->field_media_image
  -> сущность
  ?->получитьFileUri();

В случае использования Null-safe оператора, вероятно, будет быстрее получить доступ к полям сущности с помощью -> получить (), чтобы избежать дополнительной логики.

$media_field = $сущность
  ->получить('field_intro_teaser_image_media_')
  ?->сущность
  ?->получить('field_media_image')
  ?->сущность
  ?->получитьFileUri();

mogio avatar
флаг cn
Спасибо . Люблю оператора Null Safe. Никогда не использовал его до сих пор.
Рейтинг:1
флаг de

Предполагая, что вы правильно построили цепочку, вы можете сделать это следующим образом:

$медиа_поле = ПУСТО;
пытаться {
  $media_field = $entity->field_intro_teaser_image_media_->entity->field_media_image->entity->getFileUri();
}
поймать (\ Исключение $e) {
  watchdog_exception('Поиск мультимедиа');
}

если (!is_null($media_field)) {
  // Делаем вещи.
}
mogio avatar
флаг cn
Спасибо. Я сделал это так.

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.