Как Drupal обрабатывает автоматическую загрузку классов?


Как Drupal обрабатывает автоматическую загрузку классов через модули? Например, если у меня есть модуль событий, и я объявляю класс с именем Событие, а затем в файл .info включаю файл класса, как это регистрируется?

Проблема в том, что я пытаюсь динамически получить массив, содержащий все загруженные имена классов. get_declared_classes() не возвращает имена всех моих классов, объявленных таким образом, поэтому я предполагаю, что они загружены автоматически как-то. Следуя предложениям из другого вопроса о переполнении стека, я попытался получить их все с помощью spl_autoload_functions(), но это также не увенчалось успехом.

Есть идеи?

 10
Author: kiamlaluno, 2011-12-16

5 answers

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

Эта информация затем сохраняется в таблицах {registry} и {registry_files}. Поэтому, если вы хотите получить все классы или классы в соответствии с заданным шаблоном именования, вы можете запросить эти таблицы.

 13
Author: Berdir, 2016-01-23 14:08:39

Drupal поддерживает реестр кода и использует его для своего автозагрузчика классов. Чтобы заполнить этот реестр классами вашего модуля, вы должны добавить их файлы в запись files[] в файле .info:

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

Автоматическая загрузка класса PHP гарантирует, что файл родительского класса также загружен.

Спасибо пользователю пирсу-буйлу за этот ответ, смотрите его оригинальный ответ здесь на тот же вопрос.

Надеюсь, это поможет

 7
Author: stefgosselin, 2017-04-13 12:47:09

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

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

 5
Author: kiamlaluno, 2011-12-16 04:26:24

Если вы добавили запись в массив файлов[] файла .info, вам нужно будет перейти в раздел администрирования модулей и нажать "сохранить конфигурацию". Это позволит drupal обновить информацию .info, и новые записи будут зарегистрированы.

 3
Author: Webdesigner007, 2012-01-20 00:22:38

Я обнаружил, что объявление моих файлов include в файле info не позволяет распознать их при запуске модуля. Если у меня есть событие класса в файле event.inc. но если поместить объект в модуль, он не распознается. Я добавляю строку

include_once ('CMatArticleHandler.inc');

До переменной $ = новое событие(); строка. Я новичок в этом, так что, возможно, в этом есть что-то большее, чем это, но до сих пор это работало.

 1
Author: Ashlar, 2011-12-16 03:49:43