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

drupal.stackexchange https://drupal.stackexchange.com/questions/17621

  •  22-10-2019
  •  | 
  •  

Вопрос

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

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

Любые идеи?

Это было полезно?

Решение

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

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

Другие советы

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

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

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

Заслуга пользователя-пирс-куклу за этот ответ, посмотрите на его Оригинальный ответ здесь за тот же вопрос.

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

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

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

Если вы добавили запись в массив файлов файлов. Это заставит Drupal обновить информацию .info, и новые записи будут зарегистрированы.

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

include_once ('CMatArticleHandler.inc');

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с drupal.stackexchange
scroll top