Drupal 8 Plugins. Объяснение

Когда вы начинаете изучать разработку модулей под Drupal 8, скорей всего вы столкнетесь с новым Drupal’овским термином «Плагин». В этой статье я постараюсь рассказать вам, что такое плагины, а также помочь разработчикам сделать небольшой рывок от Drupal 7 к Drupal 8.

Что такое плагины?

Плагины — это новая концепция в Drupal 8, которая имеет очень важное значение при разработке модулей. Например, вы будете использовать плагины при создании пользовательских блоков в модулях, чтобы обеспечить Field API для своих полей. Или, например, при создании эффектов для изображений, таких как масштабирование и поворот изображения. Вот что написано в Drupal HandBook о плагинах:

Система плагинов Drupal 8 предоставляет собой набор руководящих принципов и повторно используемых компонентов кода, чтобы предоставить возможность разработчикам раскрыть подключаемые компоненты внутри своего кода и (при необходимости) поддерживать управление этими компонентами с помощью пользовательского интерфейса.

В какой ситуация плагины будут полезны? В любой момент, когда вам нужно позволить модулям предоставить какие-то дополнительные вещи, которые реализуют один и тот же интерфейс, но обеспечивают определенно различные функциональные возможности. Блоки являются классическим примером. В Drupal почти каждый блок состоит из одних и тех же частей, это заголовок, содержание и различные настройки, связанные с видимостью блока на страницах и кэшированием. Хотя, заголовок и содержание блока скорей всего будут генерироваться по-разному, в разных модулях. Например, блок с пользовательским содержимым, который создается вручную и блок от модуля Views.

Каждый плагин внешне будет вести себя одинаково (по отношению к коду, который его использует), но внутренне они могут отличаться. До тех пор, пока он соблюдает требование Plugin Type, которого он реализует, внешне он будет выглядеть

Какие Plugin Types существуют?

Плагины, которые выполняют похожие по функционалу действия, принадлежат одному типу. Например, все блоки принадлежат типу Block.

Plugin Type — это контракт который вы подписываете, и в котором соглашаетесь с тем, что вы будете реализовывать новую функциональность, по определенной спецификации, а также гарантируете, что менеджер плагина будет знать, как нужно взаимодействовать с вашим плагином, чтобы получать необходимые данные, или выполнить переданную ему операцию.

Менеджер плагина определяет, как плагины данного типа будут обнаруживаться и как будут создаваться экземпляры плагина. Наиболее распространенной формой обнаружения плагина, является аннотация. Следуйте стандарту PSR-4 при расположении файла вашего плагина, для того чтобы менеджер плагина сам заботился о поиске и создании экземпляров плагина, в случае необходимости используя аннотацию.

В дополнении к реализации плагинов уже существующих типов, также можно создавать свои собственные типы плагинов, позволяющие другим модулям расширить свою функциональность.

Почему плагины — это классно?

В итоге, вы пишете плагины как реализацию PHP интерфейса. И это очень сильно влияет на то как вы понимаете работу плагина, на то какой код вы должны писать и какие дополнительные операции вы могли бы выполнить. В Drupal каждый Plugin Type имеет набор требований, которым плагин должен соответствовать, всякий раз при выполнении операции, менеджер плагина, предполагает, что плагин в состоянии — это сделать. Так как все это сгруппировано в виде методов одного и того же интерфейса, это значительно упрощает жизнь разработчикам, когда нужно понять, как работает плагин.

Если вам когда-нибудь приходилось реализовать свой пользовательский блок в модуле для Drupal 7, то вы знакомы системой hook’ов с помощью которых решается эта проблема. Вы можете сказать Drupal’у о том, что у вас есть блок с помощью hook_block_info()  в котором вы предоставите всю необходимую информацию. Но этого еще не достаточно, вам также нужно реализовать hook_block_view()  для того чтобы наполнить блок содержанием. Хотите разрешить администратору добавлять какие-то пользовательские настройки? Тогда вам нужен другой hook, а чтобы их сохранить нужен еще один hook. Все эти hook’и, согласованы между собой и вам нужно знать только в каких ситуациях, какие hook’и нужно реализовывать. Когда есть такой шаблон, разработка становится проще, но когда вы делаете свой блок в модуле в первый раз, есть небольшая сложность, из-за того, что вы не знаете какие именно хуки нужно реализовывать.

Хотите, чтобы ваш модуль предоставлял больше одного блока? Тогда вам придется делать switch statements внутри каждого hook’a, чтобы определить все блоки.

Плагины позволяют инкапсулировать все это в одном файле на каждый блок. Информация о подключаемых плагинах предоставляется с помощью аннотаций @dockblock  для класса. Легко заметить что вы можете реализовать метод label()  для того чтобы вернуть понятный для человека заголовок блока, или метод build()  что вернуть содержимое блока, потому что это правило объявлено прямо в BlockPluginIntreface. Многие IDE могут обнаружить и даже авто дополнить эти методы для вас.

Для меня самое главное это наверно то, что это очень хороший опыт, иметь весь связанный код в одном месте. Один файл, один блок. Единый унифицированный способ, который сейчас распространен в Drupal, это «мой модуль хочет делать еще и сценарий X». Изучите систему плагинов, и вы будете знать, как предоставить функциональность 20+ вещей, и использовать ее, вместо того чтобы учить новый шаблон для каждого из них.

Комментарии

Добавить комментарий