Comment Drupal gère-t-il le chargement automatique des classes?

10

Comment Drupal gère-t-il le chargement automatique des classes via les modules? Par exemple, si j'ai un module Événements et que je déclare une classe appelée Événement, puis dans le fichier .info j'inclus le fichier de classe, comment est-ce enregistré?

Le problème est que j'essaie d'obtenir dynamiquement un tableau contenant tous les noms de classe chargés. get_declared_classes () ne retourne pas les noms de toutes mes classes déclarées de cette manière, donc je suppose qu'ils sont chargés automatiquement d'une manière ou d'une autre. Suite aux suggestions d'une autre question de débordement de pile, j'ai essayé de les obtenir toutes avec spl_autoload_functions () , mais cela a également échoué.

Des idées?

rybosome
la source

Réponses:

13

Tous les fichiers répertoriés dans les fichiers .info sont analysés lors de la reconstruction des modules (seuls les fichiers modifiés / nouveaux dans cette liste le sont, pour des raisons de performances).

Ces informations sont ensuite stockées dans les tables {registry}et {registry_files}. Donc, si vous voulez obtenir toutes les classes ou celles selon un modèle de nommage donné, vous pouvez interroger ces tables.

Berdir
la source
7

Drupal maintient un registre de code et l'utilise pour son chargeur automatique de classes. Pour remplir ce registre avec les classes de votre module, vous devez ajouter leurs fichiers à l'entrée files [] dans son fichier .info:

files[] = includes/Foo.inc
files[] = includes/Bar.inc

Le chargement automatique de classe de PHP s'assurera que le fichier de classe parent est également chargé.

Nous remercions l'utilisateur pier-buyle pour cette réponse, voir sa réponse originale ici pour la même question.

J'espère que cela pourra aider

stefgosselin
la source
5

spl_autoload_functions()renvoie la liste des fonctions de chargement automatique enregistrées avec spl_autoload_register(). Drupal enregistre deux fonctions de chargement automatique: une pour les classes ( drupal_autoload_class () ) et une pour les interfaces ( drupal_autoload_interface () ).

Les deux fonctions utilisent _registry_check_code () ; en utilisant son code, vous pouvez écrire une fonction qui répertorie toutes les classes implémentées par les modules Drupal 7.

kiamlaluno
la source
3

Si vous avez ajouté une entrée au tableau de fichiers [] du fichier .info, vous devrez vous rendre dans la section d'administration de vos modules et cliquer sur "enregistrer la configuration". Cela obtiendra drupal pour actualiser les informations .info, et les nouvelles entrées seront enregistrées.

Webdesigner007
la source
1

J'ai constaté que déclarer mes fichiers include dans le fichier info ne les faisait pas reconnaître lorsque je commençais à exécuter le module. Si j'ai un événement de classe dans le fichier event.inc. mais créez un objet dans le module, il n'est pas reconnu. J'ajoute la ligne

include_once ('CMatArticleHandler.inc');

avant la variable $ = new event (); ligne. Je suis nouveau dans ce domaine, donc il peut y avoir plus que cela, mais cela a fonctionné jusqu'à présent.

Pierre de taille
la source
1
Vraiment malheureux que les gens votent simplement contre au lieu d'expliquer quoi faire pour éviter d'avoir à le faire. Je suis dans la même situation: le chargeur automatique de Drupal ne reconnaît pas systématiquement la nécessité de charger un fichier pour obtenir une classe.
gréggle
Il faut effacer le registre lors de l'ajout de nouvelles classes. Un moyen facile de faire cela via drush est avec cette commande: drupal.org/project/registry_rebuild
stefgosselin