Таблица registry
Таблица registry представляет собой реестр (или регистр), который хранит mapping между именами классов/интерфейсов и физическими файлами, в которых они находятся. Этот механизм критически важен для работы автозагрузки PSR-0/PSR-4 в Drupal, заменяя более медленную автозагрузку на основе include_once.
Поля
| Поле | Тип данных | Описание |
|---|---|---|
name |
varchar(255) |
Полное имя класса, интерфейса или трейта (например, Drupal\Core\Database\Connection). Это первичный ключ таблицы.
|
type |
varchar(9) |
Тип записи. Может принимать значения: class, interface или trait.
|
filename |
varchar(255) |
Абсолютный путь к файлу, в котором находится объявление данного класса, интерфейса или трейта (например, /path/to/drupal/core/lib/Drupal/Core/Database/Connection.php).
|
module |
varchar(255) |
Имя модуля, которому принадлежит файл. Для классов ядра Drupal значение равно core или пустой строке.
|
weight |
int |
Вес, используемый для порядка загрузки. Меньшее число означает более высокий приоритет. Обычно имеет значение 0.
|
Как это работает
При первой установке Drupal или после очистки кеша (drush cr) система запускает процесс перестроения реестра. При этом сканируются все файлы в папках core/, modules/, themes/ и profiles/ в поиске классов, интерфейсов и трейтов.
Для каждого найденного элемента в таблицу registry добавляется запись, связывающая его полное имя с путем к файлу. Когда в коде встречается оператор new или используется имя класса, которое еще не было загружено, автозагрузчик обращается к этой таблице, чтобы найти и включить соответствующий файл.
Использование базы данных для хранения этой информации значительно ускоряет процесс автозагрузки по сравнению с поиском по файловой системе при каждом запросе. Таблица registry является одной из самых часто читаемых таблиц в Drupal.
Поле module помогает системе определить, к какому модулю принадлежит класс. Это используется, например, при обновлении модуля - соответствующие записи в реестре могут быть удалены и пересозданы.
Пример SQL-запроса
Найти все классы, предоставляемые модулем node:
SELECT name, filename
FROM registry
WHERE module = 'node' AND type = 'class'
ORDER BY name;
Проверить, зарегистрирован ли конкретный класс в системе:
SELECT filename, module
FROM registry
WHERE name = 'Drupal\node\Entity\Node';
Смотрите также
-
таблицу
cache_container,
которая хранит скомпилированный DI-контейнер -
таблицу
key_value,
которая используется для хранения произвольных ключ-значение данных -
таблицу
cache_bootstrap,
которая кеширует критически важные для загрузки данные -
таблицу
system,
которая хранит информацию о модулях, темах и профилях