Минимальная структура модуля
Пользовательский модуль размещается в каталоге для custom-модулей и содержит файл с метаданными, где указываются имя, тип и совместимость. Уже этого достаточно, чтобы система увидела расширение. Дополнительные файлы подключаются по необходимости: маршруты, права доступа, сервисы, меню и конфигурация. Полезно начинать с минимального набора и добавлять элементы только под конкретную задачу.
Маршрут и контроллер
Чтобы создать собственную страницу, модуль описывает маршрут: путь, обработчик и требования доступа. Обработчиком часто служит метод контроллера. Контроллер возвращает render array, который Drupal затем превращает в HTML. Этот подход позволяет системе применять темы, кеширование и другие механизмы. Формировать длинную HTML-строку вручную обычно хуже, чем использовать стандартную систему рендеринга.
Сервисы и внедрение зависимостей
Повторно используемую логику удобно оформлять как сервис. Вместо глобального обращения к контейнеру зависимость передают классу явно через конструктор. Это делает код понятнее и легче для тестирования. Сервис может отвечать за внешнее API, обработку данных, расчёты или бизнес-логику. Контроллер тогда остаётся тонким: получает запрос, вызывает нужную логику и формирует ответ.
Хуки, события и плагины
Drupal предлагает несколько механизмов расширения. Хуки подходят для ряда процедурных точек интеграции, события позволяют подписываться на происходящее в системе, а плагинная система используется для типовых расширяемых компонентов. Выбор зависит от задачи. Хороший модуль использует публичные API Drupal и избегает жёсткой зависимости от внутренней реализации ядра.
Попробуйте на практике
Спроектировать модуль, который показывает простую страницу со служебным сообщением.
- Придумайте машинное имя модуля.
- Опишите файл метаданных.
- Добавьте маршрут /example/info.
- Свяжите маршрут с методом контроллера.
- Верните из контроллера render array с текстом.
Как проверить результат. Схема верна, если модуль можно включить независимо от ядра, маршрут ведёт к контроллеру, а HTML не прошит напрямую в системные файлы.
Частые вопросы
Можно ли менять файлы ядра Drupal?
Технически можно, но это плохая практика: обновление перезапишет изменения. Используйте API расширения.
Зачем нужны сервисы?
Они отделяют повторно используемую логику и делают зависимости явными.
Что лучше: хук или событие?
Зависит от точки расширения. Следует использовать механизм, который официально предусмотрен для конкретной задачи.
Самостоятельный разбор темы. Содержание конкретной обучающей программы здесь не представлено.