Рейтинг:0

Как получить указанный объект внутри ссылки на поле?

флаг br

Я на Д9. У меня есть абзац с Соединять поле. Мне нужно получить указанный объект программно.

То, что мне удалось до сих пор, это:

       $нид = НУЛЬ;
       $field_link = $paragraph->get('field_link')->first();
       $route_params = $field_link->getUrl()->getRouteParameters();
        
        если (isset ($ route_params ['узел'])) {
          $nid = $route_params['узел'];
        }

       если ($нид) {
               ....
       }

Но выглядит довольно запутанным для меня - и полагаться на тот факт, что связанный объект имеет только тип "узел". Нет ли какой-нибудь функции, которая предоставляет данные напрямую\более надежным способом?

Рейтинг:2
флаг ru

В настоящее время я использую этот код для очень похожей задачи:

/** @var $ссылка \Drupal\Core\Url */
если (!$link->isRouted()) {
  /* внутренняя немаршрутизируемая или внешняя ссылка */
  возвращаться;
}

$route = $link->getRouteParameters();
$entityType = ключ ($ маршрут);
$referencedEntity = NULL;
пытаться {
  $referencedEntity = \Drupal::entityTypeManager()
    -> получить хранилище ($ тип сущности)
    ->загрузить($маршрут[$entityType]);
  $referencedEntity = \Drupal::service('entity.repository')
    ->getTranslationFromContext($referencedEntity);
}
поймать (бросаемый $t) {
  /* Не знаю, нужно ли это, но я не знаю, что выходит из getRouteParameters() */
  возвращаться;
}

if (!($referencedEntity instanceof \Drupal\Core\Entity\ContentEntityBase)) {
  /* возможно, вы хотите разрешить здесь различные виды сущностей, например. веб-форма не является объектом контента */
  возвращаться;
}

/* успех */
doStuff($referencedEntity);

В основном то же самое, что вы уже делаете, но вы можете использовать ключ, чтобы получить тип объекта и сделать его более общим.

4uk4 avatar
флаг cn
Отличный пример кода. Чтобы сделать более предсказуемым то, что находится в getRouteParameters(), я бы сначала проверил getRouteName() на наличие шаблона вроде `entity.ENTITY_TYPE.canonical`.

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

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