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?

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.


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


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.


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.


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.


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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.