У меня есть объект узла с именем поля имени field_image
. Когда я делаю
$node
->get('field_image')
->first()
->getValue()
Я получаю массив с некоторыми свойствами вместо объекта сущности. Массив выглядит так:
'target_id' => string '8' (length=1)
'alt' => string '' (length=0)
'title' => string '' (length=0)
'width' => string '587' (length=3)
'height' => string '458' (length=3)
'_loaded' => boolean true
'_accessCacheability' =>
object(Drupal\Core\Cache\CacheableMetadata)[1092]
protected 'cacheContexts' =>
array (size=0)
...
protected 'cacheTags' =>
array (size=0)
...
protected 'cacheMaxAge' => int -1
Нужно ли вручную загружать файл с помощью объекта, target_id
или есть способ автоматически получить объект объекта, на который ссылаются, из экземпляра Drupal\image\Plugin\Field\FieldType\ImageItem
?
Почему ссылка на сущность не доступна через геттер? Это может быть лениво загружено, если это не доступно немедленно.
PHP Fatal error: Call to undefined method Drupal\image\Plugin\Field\FieldType\ImageItem::getTarget()
. Однако$node->get('imagefield')->referencedEntities()
работает благодаря тому, что$node->get('imagefield')
возвращает экземпляр,EntityReferenceFieldItemList
который реализуетreferencedEntities()
метод. Таким образом, ваше решение является лишь частичным - оно работает для списков, но не для отдельных полей.Ответы:
Путь к ссылочной сущности очень длинный:
Конечно, все еще можно получить его через один линейный вызов, но, тем не менее, это громоздко, и мне интересно, почему
EntityReferenceItem
не предоставляется метод, который бы возвращал объект ссылочной сущности.Также стоит отметить, что довольно просто получить массив всех ссылочных объектов:
Это работает потому, что для ссылки на сущность поля
$node->get($field)
возвращает экземплярEntityReferenceFieldItemList
которого реализуетreferencedEntities()
метод.источник
Вы можете использовать:
$node->field_image->entity
если вы хотите первое значение
источник
$node->get('field_image')->entity
возвращаетFile
сущность. Однако$node->get('field_image')->getEntity()
возвращает родительскуюNode
сущность! Я понимаю, что магические методы могут быть полезны, но они являются PITA в более крупных проектах. Зачем беспокоиться о написании интерфейсов и оо-кода, если мы все равно рекомендуем использовать магию? Вы написали, что достаточно легко запомнить, как только вы это сделали - я не согласен. Как только вы начнете это делать, вы разовьете действительно плохую привычку, которая сделает ваш код менее читаемым и менее обслуживаемым.Что сработало для меня:
Другие ответы не дали массива полей сущностей, который я ожидал
источник
Как получить сущность из поля, на которое есть ссылка. Я согласен с @SiliconMind в отношении referencedEntities, он возвращает массив объектов-сущностей с ключевыми точками поля.
Просто:
$node->get('field_name')->referencedEntities();
EntityReferenceFieldItemList :: referencedEntities
источник