Wie geht Drupal mit dem automatischen Laden von Klassen um?

10

Wie geht Drupal mit dem automatischen Laden von Klassen durch Module um? Wenn ich beispielsweise ein Ereignismodul habe und eine Klasse mit dem Namen "Ereignis" deklariere und dann in der .info-Datei die Klassendatei einbinde, wie wird diese registriert?

Das Problem ist, dass ich versuche, dynamisch ein Array zu erhalten, das alle geladenen Klassennamen enthält. get_declared_classes () gibt nicht die Namen aller meiner auf diese Weise deklarierten Klassen zurück, daher gehe ich davon aus, dass sie irgendwie automatisch geladen werden . Nach den Vorschlägen einer anderen Frage zum Stapelüberlauf habe ich versucht, alle mit spl_autoload_functions () abzurufen , aber das war auch nicht erfolgreich.

Irgendwelche Ideen?

Rybosom
quelle

Antworten:

13

Alle in .info-Dateien aufgelisteten Dateien werden beim Neuerstellen von Modulen analysiert (aus Leistungsgründen nur geänderte / neue Dateien in dieser Liste).

Diese Informationen werden dann in den Tabellen {registry}und gespeichert {registry_files}. Wenn Sie also alle Klassen oder solche nach einem bestimmten Namensmuster abrufen möchten, können Sie diese Tabellen abfragen.

Berdir
quelle
7

Drupal verwaltet eine Code-Registrierung und verwendet sie für seinen Klassen-Autoloader. Um diese Registrierung mit den Klassen Ihres Moduls zu füllen, sollten Sie deren Dateien zum Eintrag files [] in der Info-Datei hinzufügen:

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

Durch das automatische Laden der PHP-Klasse wird sichergestellt, dass auch die übergeordnete Klassendatei geladen wird.

Dank an Benutzer pier-buyle für diese Antwort, siehe seine ursprüngliche Antwort hier für dieselbe Frage.

Ich hoffe, das hilft

stefgosselin
quelle
5

spl_autoload_functions()Gibt die Liste der Autoload-Funktionen zurück, bei denen registriert wurde spl_autoload_register(). Drupal registriert zwei Autoload-Funktionen: eine für die Klassen ( drupal_autoload_class () ) und eine für die Schnittstellen ( drupal_autoload_interface () ).

Beide Funktionen verwenden _registry_check_code () ; Mit seinem Code können Sie eine Funktion schreiben, die alle von Drupal 7-Modulen implementierten Klassen auflistet.

kiamlaluno
quelle
3

Wenn Sie dem Array files [] der .info-Datei einen Eintrag hinzugefügt haben, müssen Sie in den Modulverwaltungsbereich gehen und auf "Konfiguration speichern" klicken. Dadurch wird drupal zum Aktualisieren der .info-Informationen aufgefordert, und die neuen Einträge werden registriert.

Webdesigner007
quelle
1

Ich habe festgestellt, dass das Deklarieren meiner Include-Dateien in der Info-Datei diese nicht erkennt, wenn ich das Modul starte. Wenn ich ein Klassenereignis in der Datei event.inc habe. Wenn Sie jedoch ein Objekt in das Modul einfügen, wird es nicht erkannt. Ich füge die Zeile hinzu

include_once ('CMatArticleHandler.inc');

vor dem $ variable = new event (); Linie. Ich bin neu in diesem Bereich, also gibt es vielleicht mehr als das, aber es hat bisher funktioniert.

Quader
quelle
1
Wirklich bedauerlich, dass die Leute dies einfach ablehnen, anstatt zu erklären, was zu tun ist, um zu vermeiden, dass dies getan werden muss. Ich bin in der gleichen Situation: Drupals Autoloader erkennt nicht konsequent die Notwendigkeit, eine Datei zu laden, um eine Klasse zu erhalten.
greggles
Man muss die Registrierung löschen, wenn man neue Klassen hinzufügt. Eine einfache Möglichkeit, dies über Drush zu tun, ist mit diesem Befehl: drupal.org/project/registry_rebuild
stefgosselin