Як Drupal обробляє автоматичне завантаження класів?


10

Як Drupal обробляє автоматичне завантаження класів через модулі? Наприклад, якщо у мене є модуль "Події" і я оголошую клас під назвою "Подія", а потім у файл .info я включаю файл класу, як це зареєстровано?

Проблема полягає в тому, що я намагаюся динамічно отримати масив, що містить усі завантажені назви класів. get_declared_classes () не повертає імена всіх моїх класів, оголошених таким чином, тому я припускаю, що вони якось автоматично завантажуються. Виходячи з пропозицій іншого питання щодо переповнення стека, я спробував отримати їх усі з spl_autoload_functions () , але це також було невдалим.

Будь-які ідеї?

Відповіді:


13

Всі файли, перелічені у .info-файлах, аналізуються при перебудові модулів (з міркувань продуктивності лише змінені / нові файли у цьому списку).

Потім ця інформація зберігається в таблицях {registry}та {registry_files}таблицях. Отже, якщо ви хочете отримати всі класи або класи відповідно до заданої схеми іменування, ви можете запитувати ці таблиці.


7

Drupal веде реєстр коду та використовує його для автозавантажувача класів. Щоб заповнити цей реєстр класами вашого модуля, слід додати їхні файли до запису файлів [] у його .info файлі:

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

Автозавантаження класу PHP забезпечить завантаження файлу батьківського класу.

Заслуговуйте користувачеві пристані для цієї відповіді, дивіться його оригінальну відповідь тут на те саме питання.

Сподіваюся, що це допомагає


5

spl_autoload_functions()повертає список функцій автоматичного завантаження, за якими було зареєстровано spl_autoload_register(). Drupal реєструє дві функції автоматичного завантаження: одну для класів ( drupal_autoload_class () ) і одну для інтерфейсів ( drupal_autoload_interface () ).

Обидві функції використовують _registry_check_code () ; використовуючи його код, ви можете написати функцію, яка перераховує всі класи, реалізовані модулями Drupal 7.


3

Якщо ви додали запис до масиву файлів [] файлу .info, вам доведеться перейти в розділ адміністрування модулів і натиснути «зберегти конфігурацію». Це дозволить друпально оновити інформацію .info, і нові записи будуть зареєстровані.


1

Я виявив, що оголошення моїх файлів включення в файл інформації не розпізнає їх під час запуску модуля. Якщо у мене є подія класу у файлі event.inc. але ящик об'єкта в модулі він не розпізнається. Додаю рядок

include_once ('CMatArticleHandler.inc');

до змінної $ = нова подія (); рядок. Я новий у цьому, тому може бути більше, ніж це, але він працював поки що.


1
Дійсно прикро, що люди просто спростовують це, а не пояснюють, що робити, щоб не робити цього. Я в тій же ситуації: автозавантажувач Drupal не послідовно визнає необхідність завантаження файлу для отримання класу.
греглів

Потрібно очистити реєстр, додаючи нові класи. Самий простий спосіб зробити othis через Drush з цією командою: drupal.org/project/registry_rebuild
stefgosselin
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.