Jak Drupal obsługuje automatyczne ładowanie klas?

10

Jak Drupal obsługuje automatyczne ładowanie klas przez moduły? Na przykład, jeśli mam moduł Zdarzenia i deklaruję klasę o nazwie Zdarzenie, a następnie w pliku .info dołączam plik klasy, w jaki sposób jest on rejestrowany?

Problem polega na tym, że próbuję dynamicznie uzyskać tablicę zawierającą wszystkie załadowane nazwy klas. get_declared_classes () nie zwraca nazw wszystkich moich klas zadeklarowanych w ten sposób, więc zakładam, że są one jakoś automatycznie ładowane. Podążając za sugestiami z innego pytania o przepełnienie stosu, próbowałem uzyskać je wszystkie za pomocą spl_autoload_functions () , ale to również nie powiodło się.

Jakieś pomysły?

rybosome
źródło

Odpowiedzi:

13

Wszystkie pliki wymienione w plikach .info są analizowane podczas odbudowy modułów (tylko zmienione / nowe pliki na tej liście są ze względów wydajnościowych).

Informacje te są następnie przechowywane w tabelach {registry}i {registry_files}. Więc jeśli chcesz uzyskać wszystkie klasy lub te zgodnie z danym wzorcem nazewnictwa, możesz zapytać o te tabele.

Berdir
źródło
7

Drupal utrzymuje rejestr kodu i używa go do autoloadera swoich klas. Aby wypełnić ten rejestr klasami modułu, należy dodać ich pliki do wpisu files [] w pliku .info:

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

Automatyczne ładowanie klas PHP sprawi, że plik klasy nadrzędnej również zostanie załadowany.

Podziękowania dla użytkownika pier-buyle za tę odpowiedź, zobacz jego oryginalną odpowiedź tutaj na to samo pytanie.

Mam nadzieję, że to pomaga

stefgosselin
źródło
5

spl_autoload_functions()zwraca listę funkcji automatycznego ładowania, które zostały zarejestrowane spl_autoload_register(). Drupal rejestruje dwie funkcje autoload: jedną dla klas ( drupal_autoload_class () ) i jedną dla interfejsów ( drupal_autoload_interface () ).

Obie funkcje używają _registry_check_code () ; używając jego kodu, możesz napisać funkcję, która wyświetla listę wszystkich klas zaimplementowanych przez moduły Drupal 7.

kiamlaluno
źródło
3

Jeśli dodałeś wpis do tablicy plików [] pliku .info, musisz przejść do sekcji administracyjnej modułów i kliknąć „zapisz konfigurację”. Spowoduje to, że Drupal odświeży informacje .info, a nowe wpisy zostaną zarejestrowane.

Webdesigner007
źródło
1

Przekonałem się, że zadeklarowanie plików dołączanych do pliku informacyjnego nie powoduje ich rozpoznania po uruchomieniu modułu. Jeśli mam zdarzenie klasy w pliku event.inc. ale tworzy obiekt w module, nie jest rozpoznawany. Dodaję linię

include_once ('CMatArticleHandler.inc');

przed zmienną $ = nowe zdarzenie (); linia. Jestem w tym nowy, więc może być więcej niż to, ale jak dotąd działało.

Łom
źródło
1
Naprawdę niefortunne jest to, że ludzie po prostu głosują za tym, zamiast wyjaśniać, co należy zrobić, aby tego uniknąć. Jestem w tej samej sytuacji: autoloader Drupala nie konsekwentnie uznaje potrzebę załadowania pliku w celu uzyskania klasy.
greggles,
Podczas dodawania nowych klas należy wyczyścić rejestr. Prostym sposobem na zrobienie tego za pomocą drusha jest polecenie: drupal.org/project/registry_rebuild
stefgosselin