В этой статье я буду опираться на свой опыт изучения работы с плагинами Drupal 8 и выше. Мы разберем следующие вопросы, которые возникают перед тем как начать писать собственные модули:
- Что такое плагины и почему, когда и где они используются?
- Что нужно знать для старта?
- Ссылки на документацию.
Эта статья будет полезна всем, кто будет писать новые модули Drupal 8 или переносить существующий код с Drupal 7 на Drupal 8. Это поможет разработчикам лучше понять, где плагины вписываются в архитектуру модуля Drupal, и поможет сопоставить ваши знания Drupal 7 об информационных хуках и функциях обратного вызова с плагинами Drupal 8.
Что такое плагин
Система плагинов Drupal 8 это набор рекомендаций и повторно используемых компонентов, позволяющие разработчикам внедрять эти компоненты в свой код и при необходимости, поддерживать управление через пользовательский интерфейс.
Плагины это отдельный класс, который выполняет операцию в контексте заданной области, как средство расширения функциональности.
Подобная система, позволяет определять все вещи определенного типа, а затем знать что с ними делать, вне зависимости от того, где Друпал их нашел.
Плагины ограничены по объему. Это означает, что каждый экземпляр класса делает что-то одно. Каждый блок содержит название и его содержание.
В седьмом Друпал мы использовали хуки, например:
function example_block_info();
function example_block_configure($delta = '');
function example_block_view($delta = '');
function example_block_save($delta = '', $edit = array());
В восьмом, все реализуется по принципу ООП, например:
namespace Drupal\example\Plugin\Block;
class MyBlock extends BlockBase {
// Код расширяющий базовый функционал системного модуля BlockBase...
}
Что нужно знать
- стандарт PSR-4;
- аннотации;
- инъекции зависимости;
- Drupal сервисы;
- Symfony (опционально).
PSR-4
Стандарт автоматической загрузки. По сути это соглашение о наименовании. Определяет, каким образом называть файлы и в каких директориях располагать их, чтобы Друпал мог автоматически обнаружить. Размещение класса в соответствующем пространстве имен, указано в примере выше.
Аннотации
Способ работы с мета-данными, которые используются внутри блоков. Анализаторы кода могут читать комментарии, написанные определенным образом. В комментарии указываются имя, описание или другая важная информация, например:
/**
* Provides a 'New forum topics' block.
*
* @block(
* id = "form_new_block",
* admin_label = @Translation("New forum topics."),
* category = @Translation("Lists (Views)")
* )
*/
Инъекции зависимости
Концепция: встроить зависимость в объект. В ядре реализована логика всех необходимых служб, придумывать от себя не нужно. В коде своего модуля, в класс необходимо встроить класс из модуля ядра и управлять состоянием через эту зависимость.
Как используется
- через конструктор;
- через метод;
- через свойство.
Какую задачу решает Инъекции зависимости?
Взаимодействие между классами, которые имеют независимый код. Пример из жизни: отдел бухгалтерии передал отчеты о коммерческой деятельности директору. Руководителю не важно, какими методами и средствами производились подсчеты. На основе полученных данных, он пожет производить дальнейшую работу.
Зависимость можно использовать в контроллере своего модуля из любой службы ядра. Посмотреть методы, которые можно унаследовать и добавить собственную обработку смотрим в документации "API Drupal".
Сервисы
Объекты, которые выполняют какие-то действия (отправка почты или взаимодействие с базой данных), называется - сервис. Каждый сервис находится внутри специального объекта, называемого контейнером служб.
Создаются внутри модуля в директории /src/. В сервисе объявляется адресное пространство, откуда взять файл, в котором есть класс. Таким образом, в любом файле, в любом коде мы можем вызвать сервис, вместо того, чтобы писать абсолютный путь к файлу.
Знать Symfony
Отдельно изучать фреймворк не обязательно. Однако, знания лишними не будут. Для разработки плагинов в Друпал, достаточно знать стандарт PSR-4.
Куда писать код в Drupal 8
Логику модуля реализуют в специальных частях системы, где это разрешено - в контроллерах. Контроллер это файл, который будет имплементирован в потоке выполнения модуля.
Фреймворк дает структуру и управляет потоком приложения. Позволяет писать кастомный код в контроллерах и вызывает его по мере необходимости. Тем самым, контроль над исполнением кода перехватывается системой. Это называется - Inversion of Control (инверсия управления). По простому: Друпал управляет кодом, а не разработчик.
Ссылки по теме
Ссылка: | Описание |
Coding standards | Стандарты кодирования Drupal применяются к коду в Drupal и его вспомогательных модулях. |
Drupal API | Справочник по API для Drupal. |