Eu tenho um objeto de nó com o campo de imagem nomeado field_image
. Quando eu faço
$node
->get('field_image')
->first()
->getValue()
Recebo matriz com algumas propriedades em vez de objeto de entidade. A matriz fica assim:
'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
Preciso carregar manualmente a entidade do arquivo usando target_id
ou existe uma maneira de obter automaticamente o objeto de entidade referenciado da instância de Drupal\image\Plugin\Field\FieldType\ImageItem
?
Por que a entidade referenciada não está acessível via getter? Pode ser carregado preguiçosamente se não estiver disponível imediatamente.
PHP Fatal error: Call to undefined method Drupal\image\Plugin\Field\FieldType\ImageItem::getTarget()
. No entanto,$node->get('imagefield')->referencedEntities()
funciona graças ao fato de$node->get('imagefield')
retornar a instância daEntityReferenceFieldItemList
qual implementa oreferencedEntities()
método. Portanto, sua solução é apenas parcial - funciona para listas, mas não para campos únicos.Respostas:
O caminho para a entidade referenciada é muito longo:
É claro que ainda é possível obtê-lo através de uma chamada de linha, mas ainda assim é complicado e eu me pergunto por
EntityReferenceItem
que não fornece um método que retorne o objeto da entidade de referência.Também é importante notar que é muito fácil obter uma matriz de todas as entidades referenciadas:
Funciona porque para os campos de referência da entidade
$node->get($field)
retorna a instância daEntityReferenceFieldItemList
qual implementa oreferencedEntities()
método.fonte
Você pode usar:
$node->field_image->entity
se você quer o primeiro valor
fonte
$node->get('field_image')->entity
retornaFile
entidade. No entanto,$node->get('field_image')->getEntity()
retornaNode
entidade pai ! Entendo que os métodos mágicos podem ser úteis, mas são PITA em projetos maiores. Por que se preocupar em escrever interfaces e oo código se somos incentivados a usar magia de qualquer maneira? Você escreveu que é fácil lembrar uma vez que você fez - eu discordo. Quando você começar a fazer isso, desenvolverá um péssimo hábito que tornará seu código menos legível e menos sustentável.O que funcionou para mim foi:
As outras respostas não produziram a matriz de campos de entidade que eu esperava
fonte
Para saber como obter uma entidade de um campo referenciado. Estou de acordo com @SiliconMind sobre referencedEntities. Ele retorna uma matriz de objetos de entidade codificada por deltas de itens de campo.
Simples:
$node->get('field_name')->referencedEntities();
EntityReferenceFieldItemList :: referencedEntities
fonte