Estoy descubriendo que el mayor problema al trabajar con Drupal 8 es que no puedo obtener los datos que necesito. Drupal 8 quiere que use métodos públicos en lugar de perforar manualmente a través de un objeto. ¡El problema es que no puedo encontrar una manera consistente de obtener una lista de los métodos disponibles! (existen mágicamente, y siento que se supone que debo saber sobre ellos). =
Para este ejemplo, supongamos que tengo un tipo de contenido con un campo de video. Necesito obtener la URL sin procesar del archivo de video en ese campo.
Entonces comenzaría con una identificación de nodo ($ nid), y de alguna manera tengo que descubrir cómo cargar el nodo. Esto no es tan malo porque hay muchos ejemplos. Así que hago algo así $node = \Drupal\node\Entity\Node::load($nid);
.
Hasta ahora tan bueno. Entonces necesito obtener el valor de mi campo de video (field_main_video). Esto me llevó SIEMPRE a descubrir porque hay documentación contradictoria en la red. Finalmente descubrí que tendría que hacer algo como esto (porque es un elemento de varios valores):
$video = \Drupal\node\Entity\Node::load($nid)->field_main_video->getValue();
... luego recorre la matriz, etc. Usar kint tampoco me ayudó a encontrar esto. Porque, por ejemplo, si yo kint($node)
y miro bajo métodos, no veo getValue () como un elemento allí. Todavía no es terrible, porque había suficientes ejemplos para resolverlo.
Sin embargo, a medida que profundizo, lo que no sabía (esta es la parte importante) fue que en lugar de obtener la identificación de la entidad del campo de video, luego cargar la entidad, luego encontrar el campo "uri" en la entidad, etc. (como Lo haría en D7): ¡había un método que me permitía obtener el URI todo en esta misma línea de código!
$url = \Drupal\node\Entity\Node::load($nid)->field_main_video->entity->getFileUri();
Pero, ¿cómo podría haber sabido que existía getFileUri ()? Me topé con él en una publicación de blog. Esto realmente hace que obtener un URI sea más fácil que en D7 ... pero solo si sabes (mágicamente) qué métodos existen para cada 'nivel' de un objeto.
Al final, con este ejemplo, pregunto: ¿Cómo encuentra todos los métodos públicos para cada nivel de un objeto de una manera fácil de leer y entender? Tenga en cuenta que parece que debería haber una forma centrada en drupal (es decir, módulo de desarrollo) de hacer esto en lugar de buscar manualmente api.drupal.org o usar algo IDE específico.
Respuestas:
Las entidades de contenido son diferentes de la mayoría de las otras cosas en que a menudo no tienen métodos e interfaces adecuadas, al menos no para campos configurables.
En el caso de entidades y campos de contenido, los métodos públicos no son realmente lo que realmente quiere saber, lo que quiere saber es sobre campos y propiedades. Y solo cuando llegas a una entidad nuevamente a través de una referencia, entonces los métodos son importantes.
Para una descripción general, siempre me refiero a la gran hoja de trucos de API de Entity .
Las entidades de contenido tienen una estructura fija, Entidad> Campo (FieldItemList)> FieldItem -> Propiedad. Una propiedad es escalar o una referencia a otra cosa, por ejemplo, otra entidad, un objeto de lenguaje, un objeto de fecha, ...
Para algunos ejemplos específicos, algunos fragmentos útiles:
fuente
No estoy seguro de si eso responderá completamente a su pregunta, pero lo que me ayuda mucho es usar la función de diagramas en PhpStorm.
Por ejemplo, mostrando la jerarquía
Tiene opciones para mostrar también los nombres de los métodos.
Espero que esto te ayude de alguna manera.
fuente
Bueno, me encontré usando con bastante frecuencia la combinación de
var_dump(get_class_methods($object))
tener una lista de métodos disponibles para la clase dada.También busco a menudo
api.drupal.org
más detalles.fuente
Ya estás muy cerca.
Primero, veamos la definición del método: https://api.drupal.org/api/drupal/core%21modules%21file%21src%21Entity%21File.php/function/File%3A%3AgetFileUri/8.2.x
Desde aquí, podemos ver la clase de la que forma parte, y hay un enlace a ella:
Hacer clic nos lleva a: https://api.drupal.org/api/drupal/core%21modules%21file%21src%21Entity%21File.php/class/File/8.2.x
En su IDE, también puede buscar la
\Drupal\file\Entity\File
clase. Una forma de asegurarse de que esta es la clase correcta es mirar la anotación:Observe el
id
- esfile
. Presumiblemente, si se está depurando, podría mirar el contenidofield_main_video->entity
y vería esta ID en alguna parte. Luego solo búscalo en tu IDE. Por lo general, sin embargo, uno sabe lo suficiente sobre los tipos de entidad que está utilizando para adivinar el camino hacia la clase correcta (después de lo cual se puede verificar que la anotación contenga la ID correcta).En este caso particular, también sé que
File
es , probablemente, una clase que se extiendeContentEntityBase
, ya que es más como el contenido de la base de datos (una entidad de contenido) de configuración (configuración de una entidad). Entonces, cuando veo que mis suposiciones confirman, eso me ayuda a saber que he encontrado la clase correcta.En resumen: su IDE, sus
debug()
declaraciones estratégicas y algunas conjeturas son las mejores formas de descubrir Drupal 8.Los registros de cambio de PS también pueden ser útiles. Están en https://www.drupal.org/list-changes/drupal
fuente
Puede usar la función get_class_methods de PHP. El siguiente ejemplo de usuarios carga un archivo:
Esto agregará todos los métodos disponibles para el archivo de objeto $ en su matriz de $ métodos, que puede imprimir y luego ver todos los métodos disponibles. Esto es válido para cualquier objeto en PHP, no solo Drupal.
fuente