Estou descobrindo que o maior problema ao trabalhar com o Drupal 8 é que não consigo obter os dados necessários. O Drupal 8 quer que eu use métodos públicos em vez de detalhar manualmente um objeto. O problema é que não consigo descobrir uma maneira consistente de obter uma lista dos métodos disponíveis! (eles existem magicamente, e eu sinto que devo saber sobre eles). =
Neste exemplo, digamos que eu tenha um tipo de conteúdo com um campo de vídeo. Preciso obter o URL bruto do arquivo de vídeo nesse campo.
Então, eu começaria com uma identificação de nó ($ nid) e, de alguma forma, tenho que descobrir como carregar o nó. Isso não é tão ruim, porque há muitos exemplos. Então eu faço algo parecido $node = \Drupal\node\Entity\Node::load($nid);
.
Por enquanto, tudo bem. Preciso obter o valor do meu campo de vídeo (field_main_video). Isso sempre me levou a descobrir, porque há documentação conflitante em torno da rede. Finalmente, descobri que teria que fazer algo assim (porque é um item de vários valores):
$video = \Drupal\node\Entity\Node::load($nid)->field_main_video->getValue();
... então percorrer o array etc. Usar o kint também não me ajudou a encontrar isso. Porque, por exemplo, se eu kint($node)
olhar em métodos, não vejo getValue () como um item lá. Ainda não é terrível, porque havia exemplos suficientes para descobrir isso.
À medida que vou mais fundo, porém, o que eu não sabia (essa é a parte importante) era que, em vez de obter o ID da entidade do campo de vídeo, carregar a entidade e encontrar o campo "uri" na entidade, etc. (como Gostaria em D7): Havia um método que me permite obter o URI nessa mesma linha de código!
$url = \Drupal\node\Entity\Node::load($nid)->field_main_video->entity->getFileUri();
Mas como eu poderia saber que esse getFileUri () existia? Por acaso tropeçou em um post do blog. Isso realmente facilita a obtenção de um URI do que no D7 ... mas apenas se você souber (magicamente) quais métodos existem para cada 'nível' de um objeto.
No final, com este exemplo, pergunto: Como você encontra todos os métodos públicos para cada nível de um objeto de uma maneira fácil de ler e entender? Observe que parece que deve haver uma maneira centrada em drupal (isto é, módulo devel) de fazê-lo, em vez de pesquisar manualmente api.drupal.org ou usar algo específico do IDE?
Respostas:
As entidades de conteúdo são diferentes da maioria das outras coisas, pois geralmente não possuem métodos e interfaces adequadas, pelo menos não para campos configuráveis.
No caso de entidades e campos de conteúdo, métodos públicos não são realmente o que você realmente deseja saber, o que você deseja é saber sobre campos e propriedades. E somente quando você chega a uma entidade novamente através de uma referência, os métodos são importantes.
Para uma visão geral, sempre me refiro à excelente Folha de Dicas da API de Entidades .
As entidades de conteúdo têm uma estrutura fixa, Entidade> Campo (FieldItemList)> FieldItem -> Propriedade. Uma propriedade é escalar ou uma referência a outra coisa, por exemplo, outra entidade, um objeto de linguagem, um objeto de data, ...
Para alguns exemplos especificados, alguns trechos úteis:
fonte
Não tenho certeza se isso responderá completamente à sua pergunta, mas o que me ajuda muito é usar o recurso de diagramas no PhpStorm.
Por exemplo, mostrando a hierarquia
Você tem opções para mostrar também nomes de métodos
Espero que isso ajude você de certa forma.
fonte
Bem, eu me vi usando muitas vezes a combinação de
var_dump(get_class_methods($object))
ter uma lista de métodos disponíveis para a classe em questão.Também procuro com frequência para
api.drupal.org
obter mais detalhes.fonte
Você já está muito perto.
Primeiro, vejamos a definição do método: https://api.drupal.org/api/drupal/core%21modules%21file%21src%21Entity%21File.php/function/File%3A%3AgetFileUri/8.2.x
A partir daqui, podemos ver a classe da qual faz parte e há um link para ela:
Clicar nesse link nos leva a: https://api.drupal.org/api/drupal/core%21modules%21file%21src%21Entity%21File.php/class/File/8.2.x
No seu IDE, você também pode procurar a
\Drupal\file\Entity\File
classe. Uma maneira de garantir que essa é a classe correta é observar a anotação:Observe o
id
- éfile
. Presumivelmente, se estiver depurando, você pode ver o conteúdofield_main_video->entity
e ver esse ID em algum lugar. Depois, basta procurá-lo no seu IDE. Normalmente, porém, se sabe o suficiente sobre os tipos de entidade que você está usando para adivinhar o caminho para a classe correta (após o qual se pode verificar se a anotação contém o ID correto).Nesse caso em particular, também sei que provavelmente
File
é uma classe que se estende , pois é mais parecida com o conteúdo do banco de dados (uma entidade de conteúdo) do que com a configuração (uma entidade de configuração). Então, quando vejo minhas suposições confirmadas, isso me ajuda a saber que encontrei a classe certa.ContentEntityBase
Então, resumindo: seu IDE,
debug()
declarações estratégicas e algumas suposições são as melhores maneiras de descobrir o Drupal 8.Os registros PS Change também podem ser úteis. Eles estão em https://www.drupal.org/list-changes/drupal
fonte
Você pode usar a função get_class_methods do PHP. O exemplo abaixo utiliza um upload de arquivo:
Isso adicionará todos os métodos disponíveis ao arquivo $ do objeto na sua matriz $ methods, que você pode imprimir e ver todos os métodos disponíveis. Isso é válido para qualquer objeto no PHP, não apenas para o Drupal.
fonte