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

10

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

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

Любые идеи?

rybosome
источник

Ответы:

13

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

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

Berdir
источник
7

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

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

Автозагрузка классов PHP обеспечит загрузку файла родительского класса.

Благодарим пользователя pier-buyle за этот ответ, см. Его оригинальный ответ здесь на тот же вопрос.

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

stefgosselin
источник
5

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

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

киамалуно
источник
3

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

Webdesigner007
источник
1

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

include_once ('CMatArticleHandler.inc');

до $ variable = new event (); линия. Я новичок в этом, так что может быть что-то еще, чем это, но это сработало до сих пор.

штучный камень
источник
1
Очень жаль, что люди просто понижают это, вместо того, чтобы объяснять, что делать, чтобы избежать необходимости делать это. Я нахожусь в той же ситуации: автозагрузчик Drupal не всегда признает необходимость загрузки файла для получения класса.
greggles
Нужно очистить реестр при добавлении новых классов. Самый простой способ сделать это с помощью drush с помощью этой команды: drupal.org/project/registry_rebuild
stefgosselin