Плагины — небольшие кусочки бизнес-логики.
Тип плагина — плагины, выполняющие один и тот же функционал.
В Drupal 9 находится много плагинов, и типов плагинов по умолчанию. Например, "Блок" (@Block
) - это тип плагина, а каждый уникальный объект, реализующий данный тип плагина и предоставляющий данные — плагин.
Плагины объявляются и используются в модулях. Разработчики также могут создавать свои собственные типы плагинов и использовать плагины для своих нужд.
Систему плагинов можно разделить на несколько фундаментальных элементов:
- Plugin Types — централизованное место, объявляющая как плагины данного типа будут обнаруживаться и использоваться.
-
Plugin Discovery — процесс, который используется менеджером плагинов, для того чтобы найти плагины конкретного типа, объявленных во всех модулях. Плагины могут объявляться несколькими способами:
- Annotation: Данный плагины являются объектами, в комментариях класса которого находится аннотация, описывающая параметры для конкретного типа плагина. Это основной способ определения и поиска плагинов, как и самый распространенный для создания собственных типов.
- Хуки: Плагины, объявленные через хуки.
- YAML: Плагины, описанные в YAML файлах. Ядро Drupal использует данный способ для обнаружения ссылок local tasks (вкладки) и local action (кнопки действий на страницах). Данный способ очень полезен для тех типов плагинов, где используется один общий класс.
- Static: Плагины являются объектами, но регистрируются менеджером плагинов. Это полезно, если вы хотите запретить создание плагинов данного типа (используется статичный список плагинов в коде).
- Plugin Factory — отвечает за определение плагинов для конкретного использования.
¶Плагины или сервисы?
Плагины и сервисы очень похожи друг на друга, и могут решать одну и ту же задачу, стоит различать, когда подойдет сервис, а когда плагин.
¶Плагины и сервисы с метками
Возьмем для примера менеджеры хлебных крошек, которые являются сервисами с меткой, а также тип плагина "Блок".
Фундаментальная задача у них схожая — дать разработчику возможность описать своё поведение в контексте задачи. Оба варианта описывают бизнес логику в PHP объекте, и их результат затем используется с определенной целью. Но у них есть одно принципиальное отличие — менеджер хлебных крошек никак не взаимодействует с пользователем. Он просто подготавливает данные для построения хлебных крошек, и участие пользователя не имеет значения и не влияет на результат его работы. Блок, с другой стороны, тоже генерирует какой-то результат, но имеет возможность дать пользователю повлиять на него. Типы плагинов "Блок" могут предоставлять пользовательский интерфейс с настройками, которые могут быть учтены плагином в дальнейшем. Например, у блоков меню, объявленных через плагины, вы можете выбирать максимальный уровень вложенности выводимого меню.
Используйте плагины, если у пользователя есть возможность (даже опциональная) влиять на работу, в остальных случаях, когда взаимодействие не требуется — используйте сервисы с метками.