Je trouve que le plus gros problème avec Drupal 8 est que je ne peux pas obtenir les données dont j'ai besoin. Drupal 8 veut que j'utilise des méthodes publiques plutôt que d'explorer manuellement un objet. Le problème est que je n'arrive pas à trouver un moyen cohérent d'obtenir une liste des méthodes disponibles! (ils existent comme par magie, et j'ai l'impression que je suis juste censé les connaître). =
Pour cet exemple, disons que j'ai un type de contenu avec un champ vidéo. J'ai besoin d'obtenir l'URL brute du fichier vidéo dans ce champ.
Je commencerais donc par un identifiant de nœud ($ nid), et je dois en quelque sorte trouver comment charger le nœud. Ce n'est pas trop mal car il y a beaucoup d'exemples. Donc je fais quelque chose comme $node = \Drupal\node\Entity\Node::load($nid);
.
Jusqu'ici tout va bien. Ensuite, j'ai besoin d'obtenir la valeur de mon champ vidéo (field_main_video). Cela m'a pris POUR TOUJOURS à comprendre parce qu'il y a une documentation conflictuelle autour du net. Enfin, j'ai compris que je devrais faire quelque chose comme ça (car c'est un élément à plusieurs valeurs):
$video = \Drupal\node\Entity\Node::load($nid)->field_main_video->getValue();
... puis boucle à travers le tableau, etc. L'utilisation de kint ne m'a pas non plus aidé à trouver cela. Parce que, par exemple, si je kint($node)
regarde sous les méthodes, je ne vois pas getValue () comme un élément là-bas. Toujours pas terrible, car il y avait suffisamment d'exemples pour le comprendre.
En approfondissant, cependant, ce que je ne savais pas (c'est la partie importante), c'est que plutôt que d'obtenir l'ID d'entité du champ vidéo, puis de charger l'entité, puis de trouver le champ "uri" dans l'entité, etc. (comme Je le ferais en D7): Il y avait une méthode qui me permet d'obtenir l'URI tout dans cette même ligne de code!
$url = \Drupal\node\Entity\Node::load($nid)->field_main_video->entity->getFileUri();
Mais comment aurais-je pu savoir que cette getFileUri () existait? Il m'est arrivé de tomber dessus dans un article de blog. Cela rend vraiment l'obtention d'un URI plus facile qu'en D7 ... mais seulement si vous savez (comme par magie) quelles méthodes existent pour chaque «niveau» d'un objet.
En fin de compte, avec cet exemple, je demande: Comment trouvez-vous toutes les méthodes publiques pour chaque niveau d'un objet d'une manière facile à lire et à comprendre? Notez qu'il semble qu'il devrait y avoir une méthode centrée sur Drupal (c'est-à-dire un module de développement) plutôt que de rechercher manuellement api.drupal.org ou d'utiliser quelque chose d'IDE spécifique?
Réponses:
Les entités de contenu sont différentes de la plupart des autres choses en ce qu'elles n'ont souvent pas de méthodes et d'interfaces appropriées, du moins pas pour les champs configurables.
Dans le cas d'entités de contenu et de champs, les méthodes publiques ne sont pas vraiment ce que vous voulez réellement savoir, ce que vous voulez, c'est connaître les champs et les propriétés. Et ce n'est que lorsque vous accédez à nouveau à une entité via une référence que les méthodes sont importantes.
Pour un aperçu, je me réfère toujours à la grande feuille de triche de l'API d'entité .
Les entités de contenu ont une structure fixe, Entité> Champ (FieldItemList)> FieldItem -> Propriété. Une propriété est soit scalaire, soit une référence à autre chose, par exemple une autre entité, un objet langage, un objet date, ...
Pour quelques exemples spécifiés, quelques extraits utiles:
la source
Je ne sais pas si cela répondra complètement à votre question, mais ce qui m'aide beaucoup, c'est d'utiliser la fonction de diagrammes dans PhpStorm.
Par exemple, montrant la hiérarchie
Vous avez des options pour afficher également les noms des méthodes
J'espère que cela vous aide en quelque sorte.
la source
Eh bien, je me suis retrouvé à utiliser assez souvent la combinaison de
var_dump(get_class_methods($object))
pour avoir une liste des méthodes disponibles pour la classe donnée.Je cherche aussi assez souvent
api.drupal.org
pour plus de détails.la source
Tu es déjà très proche.
Tout d'abord, regardons la définition de la méthode: https://api.drupal.org/api/drupal/core%21modules%21file%21src%21Entity%21File.php/function/File%3A%3AgetFileUri/8.2.x
De là, nous pouvons voir la classe dont il fait partie, et il y a un lien vers celle-ci:
Cliquer dessus nous amène à: https://api.drupal.org/api/drupal/core%21modules%21file%21src%21Entity%21File.php/class/File/8.2.x
Dans votre IDE, vous pouvez également rechercher la
\Drupal\file\Entity\File
classe. Une façon d'être sûr que c'est la bonne classe est de regarder l'annotation:Remarquez le
id
- c'estfile
. Vraisemblablement, si vous déboguez, vous pourriez regarder le contenu defield_main_video->entity
et vous verriez cet ID quelque part. Il vous suffit ensuite de le rechercher dans votre IDE. Habituellement, cependant, on en sait assez sur les types d'entités que l'on utilise pour deviner son chemin vers la bonne classe (après quoi on pourrait vérifier que l'annotation contient l'ID correct).Dans ce cas particulier, je sais également que
File
c'est probablement une classe qui s'étendContentEntityBase
, car elle ressemble plus au contenu de la base de données (une entité de contenu) qu'à la configuration (une entité de configuration). Donc, quand je vois mes hypothèses se confirmer, cela m'aide à savoir que j'ai trouvé la bonne classe.Donc, en bref: votre IDE, vos
debug()
déclarations stratégiques et certaines hypothèses sont les meilleurs moyens de découvrir Drupal 8.Les enregistrements PS Change peuvent également être utiles. Ils sont sur https://www.drupal.org/list-changes/drupal
la source
Vous pouvez utiliser la fonction PHP get_class_methods. L'exemple ci-dessous utilise un téléchargement de fichier:
Cela ajoutera toutes les méthodes disponibles au fichier $ objet dans votre tableau $ methods, que vous pourrez imprimer et voir toutes les méthodes disponibles. Ceci est valable pour tous les objets en PHP, pas seulement Drupal.
la source