Module structure Flashcards

1
Q

Какой минимальный набор файлов нужен для создания модуля? Какие ещё
файлы там могут быть? Зачем нужен каждый из них?

A

Директория, которая станет корнем модуля, а также файл *.info.yml, описывающий модуль.
module.module - содержит хуки и кастомные функции
module.routing.yml - содержит записи о роутах модуля со ссылками на соответствующие классы
module.links.menu.yml - содержит информацию о том в каком меню нужно расположить ссылку на тот или иной роут
module_name.services.yml - конфигурационный файл описания сервисов.
module_name.links.menu.yml - конфигурационный файл описания ссылок меню.
module.install - содрежит hook_install и hook_update
module.module - содержит хуки и кастомные функции
module.permissions.yml - содержит записи о разрешениях, которые добавляет в систему модуль
/config/schema/module.schema.yml - содержит разделы для создания кастомных таблиц в БД и данные о присвоении значений по-умолчанию полям форм
В директории src храняться классы контроллеров, форм, сервисов, плагинов.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
2
Q

a. Что может находиться внутри .info.yml файла?

A
  • name: Название модуля, отображаемое в административном интерфейсе. Например name: Hello World Module.
  • type: Тип “расширения” друпал. Может принимать одно из следующих значений: module, theme, profile. В случае модулей, обязательно указывать “module”. Например type: module.
  • core: (опционально при указании core_version_requirement) Версия ядра, для которой предназначен данный модуль. Для Drupal 8 это 8.x. Например core: 8.x.
  • core_version_requirement: (опционально, рекомендуемо, Drupal 8.7.8+) Указывает версии ядра, с которыми совместим модуль. Данное принимает запись версий с семантическим версионированием, также, в нём можно указать множественные версии. Например: core_version_requirement: ^8, core_version_requirement: ^8 || ^9, core_version_requirement: ^8.8 || ^9.
  • description: (опционально) Описание модуля, отображаемое на странице списка модулей под названием. Например description: Example Module description..
  • package: (опционально) Название группы, в которой необходимо расположить модуль в административном интерфейсе. По умолчанию все модули получают значение Custom, вы можете указывать собственное название. Например package: Project name. Название группы обрабатывается t(), это означает, что строка будет переводимой и необходимо использовать только латинские названия.
  • dependencies: (опционально) Список модулей, от которых зависит данный модуль. Название зависимостей должно быть в формате {project}:{module}, где {project} название проекта на drupal.org (например drupal.org/project/views - views) и {module} машинное название модуля. Вы также можете указать каждой зависимости ограничения по версии, например yandex_yml:yandex_yml (>=8.x-1.x).
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
3
Q

b. Что такое апдейты (hook_update)?

A

Хук hook_update_N() производит единоразовое выполнение кода, необходимое для обновления модуля на более новую версию.

В основном в этом хуке изменяют схему бд, но ничто не мешает выполнить в нём любой другой код.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
4
Q

i. Что такое пакетная операция? Как применить её внутри hook_update?

A

Суть batch в том чтобы максимально эффективно использовать ресурсы сервера для выполнения задачи при этом не затормозить его работу. Также batch api позволяет разделить длительную операцию на множество более коротких и отображать визуально прогресс выполнения задачи.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
5
Q
  1. Что такое “сервис”?
A

Сервисы — это объекты, которые используется в вашем приложении глобально. Инстанцированием
их управляет сервис контейнер.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
6
Q

a. Какова структура описания сервиса?

A

создать класс сервиса и прописать его в сервисес ямл в параметре class

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
7
Q

b. Как можно подменить уже существующий сервис? Способы.

A

подменить существующий сервис через класс сервиспровайдер, в котором указать метод alter(), декорацию, по ключу в module_name.services.yml.
services:
app.mailer:
class: AppBundle\Mailer

app.decorating_mailer:
    class:     AppBundle\DecoratingMailer
    # переопределяет сервис app.mailer
    # но этот сервис всё ещё доступен как app.decorating_mailer.inner
    decorates: app.mailer
        # передать старый сервис, как аргумент
        arguments: ['@app.decorating_mailer.inner']

Опция decorates сообщает контейнеру, что сервис app.decorating_mailer заменяет сервис app.mailer. Старый сервис app.mailerпереименовывается наapp.decorating_mailer.inner, чтобы вы могли внедрить его в ваш новый сервис.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
8
Q

c. Для чего используются сервис-тэги?

A

Теги используются для загрузки определенных «помеченных» сервисов. Идентификации групп сервисов. позволяют получить список всех services по определенному тэгу и использовать/модифицировать их специальным образом
name — название тега (по нему и будут искать сервисы с одним тегом);
tag — внутреннее именование “тега” внутри того кода, который дергает сервисы по данному тегу, по дефолту принимает название сервиса;
call — название метода, который нужно вызвать для получения результата

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
9
Q

d. Доп. возможности:

A

iii. Коллекции сервисов

v. Наследование
Публичные и приватные сервисы
Приватные сервисы могут быть использованы только в качестве аргументов для других сервисов. Публичные сервисы можно вызывать из контейнера, как это обычно и происходит. В случае с приватными сервисами (public: false), они могут быть вызваны только в качестве Dependency Injection.
Приватные сервисы позволяют контейнеру понимать, будут ли они созданы и как. Это увеличивает производительность контейнера.
Алиасы
Позволяет добавить синоним для сервиса. Сервис будет доступен как по оригинальному названию, так и по синониму. Нужно для сокращения названий, если такое потребуется. Или если сменили название сервиса, но решили подержать старое название какое-то время чтобы все успели изменить в коде, проще говоря обратная совместимость.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
10
Q
  1. Каким образом можно обратиться к сервису (получить сервис)?
A

a. Глобальный объект Drupal
$date = \Drupal::service(‘date’);

b. Через фабричный метод и инъекцию зависимости

i. Что такое “инъекция зависимости”, зачем она нужна? Каким
образом её можно осуществить в Drupal 8?
Когда объект зависимости инстанцируется вне класса, и потом готовый объект передаются как аргументы в конструктор или внедряются через «сеттеры».
Инъекция зависимости это наиболее предпочтительный способ для работы с сервисами в Drupal 8 и именно его следует использовать в первую очередь. Вместо обращения к глобальным сервис контейнерам, сервисы передаются как аргументы в конструктор или внедряются через «сеттеры».

ii. Что такое Service container (DI-container)?
глобальный объект, который создается и наполняется ядром перед обработкой запроса. Позже его можно использовать в коде для получения сервисов, загружаемых лениво на лету.
Service container очень важен, поскольку содержит доступные сервиы, знает об их отношениях и конфигурациях и даже создает их!
c. Через указание аргументов при описании сервиса
dummy.services.yml

parameters:
dummy.message_types:[‘status’,’warning’,’error’]

services:

dummy. random_message:
class: Drupal\dummy\RandomMessageGenerator
dummy. random_drupal_message:
class: Drupal\dummy\RandomDrupalMessage
arguments: [‘@dummy.random_message’, ‘%dummy.message_types%’]

Здесь @dummy.random_message указывает на то, что сервис dummy.random_message передается в dummy.random_drupal_message в качестве аргумента. Таким образом реализуется инъекция зависимости

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
11
Q
  1. Что такое “плагин”? Чем плагин отличается от сервиса?
    a. Как создать свой плагин уже существующего типа?
    b. Как создать новый тип плагина?
    c. Что такое Plugin Derivative, зачем он нужен?
    d. Как можно подменить уже существующий плагин?
A

Плагин - маленький кусочек функциональности, а плагинМенеджер - сервис.
Плагины - классы, наследующие плагинбесе
Также стоит заметить, что сервисы по большей части - это просто куски логики, без какой-либо интерактивности с пользователем. Тогда как плагины зачастую позволяют объявлять свои собственыне формы для пользователей и т.д., а менеджеры данных плагинов, это учитывают.
Плагины реализуют различное поведение через общий интерфейс. Например, подумайте о преобразованиях изображений. Общие преобразования изображения - это масштабирование, обрезка, обесцвечивание и т. Д. Каждый тип преобразования действует одинаково с одними и теми же данными - он принимает файл изображения, выполняет преобразование, а затем возвращает измененное изображение. Однако каждый эффект очень отличается. Сервисы предоставляют одинаковые функциональные возможности и взаимозаменяемы, отличаясь только внутренней реализацией. Подумайте о кеш-памяти. Кэш должен предоставлять методы получения, установки и истечения срока действия. Пользователь просто ожидает кэш, и один должен иметь возможность заменить другой без каких-либо функциональных различий. Внутренняя реализация этих методов и механизмы, которые они для этого используют, могут сильно отличаться. В этом случае услуга более уместна. Исключение Если вы предоставляете пользовательский интерфейс, через который люди могут настраивать или выбирать, какую реализацию они хотят, вы должны использовать систему плагинов - даже если в основном меняются только детали реализации.
a. Как создать свой плагин уже существующего типа?
плагин должен наследовать плагинбейс и иметь аннотацию с @plugin
b. Как создать новый тип плагина?
Плагины состоят из:

Аннотации - это то что в комментариях задается. По сути можно передать какие-то базовые данные о плагине без необходимости писать код и методы. Т.е. данные что у плагина всегда будут статичны внутри него и не будут меняться ни при каких обстоятельствах - можно выносить в аннотации, например: id плагина и его заголовок. Обязательно, как минимум, должен содержать id;
Интерфейс плагина - тут мы описываем какие методы плагин обязан описать у себя; определяет тип плагина
База плагина (Plugin Base) - абстрактный класс, который наследуется от интерфейса плагина и позволяет для методов задать значения по-умолчанию, тем самым сделав эти методы не обязательными для объявления, если поведения из базового хватает. Это очень востребовано для получения данных из аннотации, так как они получаются всегда одним путем, то их можно описать в базе плагина;
Менеджер плагина (это сервис) -Это сервис в Drupal 8, который отвечает за определение того, как найти ваши плагины и создать их экземпляры. это класс который описывает где искать наш плагин, и указывает что является интерфейсом плагина и аннотацией. Также здесь мы можем зарегистрировать hook_alter для изменения информации о плагине через хуки. Вам необходимо определить метод обнаружения и фабрику.
c. Что такое Plugin Derivative, зачем он нужен?
PluginDerriative - позволяет реализовать одним классом сколько угодно плагинов динамически определяемых в рантайме. Суть дериватив в том, что они позволяют зарегистрировать сколько угодно экземпляров одного и того же плагина, с отличными настройками, при необходимости, но общей для всех данных плагинов логикой .
d. Как можно подменить уже существующий плагин?
через аннотацию, и еще каким-то методом

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
12
Q
  1. Что такое “аннотация” (в плагине)?

a. Как создать свою?

A

Аннотация – небольшой фрагмент кода в блоке документации вашего класса плагина. это набор данных по которым PluginManager находит и понимает что это за плагин.
src/Annotation
там класс, который наследуется от плагин и имеет название такое же, что и @plugin в аннотации к плагину

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
13
Q
  1. Как создать свою кастомную таблицу?
A

а) hook_schema() в файле module.install

б) + hook_update_N() в файле module.install в случае, если таблица создается после установки модуля

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
14
Q
  1. Где и как хранятся текущие версии модулей? Как можно изменить текущую версию?
A

Текущие версии модулей хранятся в composer.lock
Чтобы установить указанные в этом файле версии модулей следует запустить команду “composer install”
Команда «composer update» позволяет произвести поиск новых версий модулей и установить их

How well did you know this?
1
Not at all
2
3
4
5
Perfectly