Ця стаття є першою з трьох частин серії про те, як побудувати модуль Drupal 8

Як побудувати модуль Drupal 8:

Побудова модуля Drupal 8: маршрутизація, контролери і меню посилань.
Побудова модуля Drupal 8: блоки і модулі.
Побудова модуля Drupal 8: управління конфігурацією і службовий контейнер.

В Drupal 8 з’явилося багато змін, які покликані поставити його в один ряд з іншими сучасними PHP — фреймворками. Це означає, що старий стиль процедурного програмування PHP4 значною мірою замінений об’єктно-орієнтованою архітектурою.

З цією метою за ініціативою Proudly Found Elsewhere в Drupal 8 був включений код не розроблявся спеціально під Drupal.

Одним з найбільш важливих доповнень в Drupal 8 є компоненти Symfony, включення яких може суттєво позначитися на спільноті розробників.

По-перше, це потенційно може значно збільшити кількість розробників, які тепер захочуть розвивати Drupal. По-друге, це трохи налякало деяких розробників Drupal 7, які не мають великого досвіду роботи з сучасними методами PHP.

Але це нормально, ми всі вчимося, і уроки, винесені з роботи з Symfony (і, сподіваюся, з Drupal 8), можна буде з успіхом застосувати і в роботі з іншими фреймворками.

На сьогодні Drupal 8 вже знаходиться на досить пізній стадії релізної циклу, в поточний момент написана версія alpha11. Ми будемо використовувати цю версію, щоб показати деякі з основних змін у побудові модулів порівняно з Drupal 7, з якими розробники зіткнуться в першу чергу, і до яких вони повинні бути готові.

Я створив Git-сховище, де ви зможете знайти код, який я пишу в цій серії статей, і слідувати йому, якщо захочете.

Як створити модуль?

Перше, що ми збираємося розглянути — це визначення необхідної структури файлів і папок, які повинні розповісти Drupal 8 про нашому новому модулі. В Drupal 7, ми повинні були створити, принаймні, два файли (.info і .module), але в Drupal 8, досить YAML-версії.

І так, файли .info тепер замінено на .info.yml і містять ті ж дані, але мають іншу структуру.
Ще однією важливою зміною є те, що папки користувача і контриб-модулів тепер розміщуються прямо в кореневій папці modules/.

Це зроблено тому, що весь код ядра був переміщений в окрему власну папку core/. Звичайно, всередині папки modules/ вам пропонується розділити модулі на власні та сторонні, як в Drupal 7. Давайте рухатися далі.

Створимо модуль під назвою demo (дуже оригінально) і помістимо його в папку modules/custom/. І як я вже говорив, всередині цієї новоствореної папки demo/ розміщуватиметься все, що нам потрібно, щоб почати роботу з файлом demo.info.yml:

name: Drupal 8 module Demo
description: ‘Demo module for Drupal 8 alpha11’
type: module
core: 8.x

Три з чотирьох наведених записів повинні бути вам знайомі (name, description і core). Вказівка type в даний час також є обов’язковою вимогою, так як ви можете використовувати YML-файли для тем.

Ще одна важлива річ, на яку слід звернути увагу — прогалини в YML-файли мають значення і відповідні відступи використовуються для організації даних у структуру за зразком масивів.

Ви можете ознайомитися з цією сторінкою з офіційної документації, щоб отримати більш детальну інформацію щодо інших пар ключ-значення, які можуть застосовуватися .info.yml-файли модуля, а також з цим звітом про зміни, в якому були анонсовані нові правила для цього формату.

Ось і все, нам потрібен всього один файл. Тепер ви можете перейти на сторінку Extend, знайти модуль Demo і включити його. Як я вже казав, що нам більше не потрібно створювати файл .module, щоб підключити модуль.

З точки зору архітектури, сумарний розмір файлів .module буде істотно менше, за рахунок перенесення більшої частини бізнес логіки в службові класи, контролери і плагіни, але їх (деякі з них) ми розглянемо трохи пізніше.

Що таке ‘routing’, і що сталося з hook_menu() і його зворотніми викликами?

В Drupal 7, hook_menu() було, ймовірно, найбільш часто реалізуються зверненням, тому що воно використовувалося для визначення шляху до Drupal і підключення цього шляху до функцій зворотного виклику. Воно також відповідала за створення посилань меню і купу інших речей.

В Drupal 8 ми більше не будемо потребувати hook_menu(), оскільки тут для обробки маршрутів можна широко використовувати компоненти Symfony 2.

В тому числі визначати маршрути в якості конфігурації і обробляти зворотні дзвінки в контролері (метод класу Controller). Давайте розглянемо, як це працює, створивши просту сторінку, яка виводить класичне «Привіт, Світ!»

По-перше, ми повинні створити файл маршрутизації для нашого модуля під назвою demo.routing.yml. Цей файл розміщується в кореневій папці модуля (поряд із demo.info.yml). У цьому файлі у нас може бути наступне (просте) визначення маршруту:

demo.demo:
path: ‘/demo’
defaults:
_content: ‘DrupaldemoControllerDemoController::demo’
_title: ‘Demo’
вимога:
_permission: ‘access content

Перший рядок означає початок нового маршруту під назвою demo для модуля demo (спочатку йде назва модуля, потім назва маршруту).

Під path, ми вказуємо шлях, по якому хочемо зареєструвати цей маршрут. Під defaults у нас є два елементи: заголовок сторінки за замовчуванням (_title) і _content, який пов’язує метод з класом DemoController.

Під вимога ми вказуємо права доступу, які користувач повинен мати, щоб переглядати сторінку. Раджу вам ознайомитись з цією сторінкою офіційної документації, щоб отримати більше інформації щодо опцій, які можливі для цього файлу маршрутизації.

Тепер, давайте створимо наш перший контролер під назвою DemoController. Він буде містити метод demo(), що викликається, коли користувач надсилає запит на цю сторінку.

У папці модуля створіть папку з ім’ям src/, а в ній папку Controller/. У ній ми будемо зберігати класи контролерів. Йдемо далі. Створіть перший контролер: DemoController.php.

Розміщення контролерів і, як ми побачимо, інших класів, в папці src/ є елементом відповідності стандарту PSR-4.

Спочатку нам потрібно було створювати більше структурних папок (стандарт PSR-0), але в даний момент функціонує перехідний режим, при якому застосовуються обидва цих стандарту. Так що якщо ви все ще бачите код в папці під назвою lib/, це стандарт PSR-0.

Всередині нашого файлу DemoController.phpми тепер можемо оголосити клас:

t(‘Привіт, Світе!’),
);
}
}

Це самий мінімум того, що потрібно зробити для того, щоб відобразити на сторінці. У верхній частині ми визначаємо область імен класу, а нижче оголошуємо клас.

Всередині класу DemoController у нас є тільки метод demo(), який повертає масив, схожий на Drupal 7. Нічого істотного.

Все, що ми повинні зараз зробити, це очистити кеш і перейти за адресою http://example.com/demoі там ми повинні побачити сторінку Drupal з привітанням «Привіт, Світ!»

Як щодо посилань меню?

В Drupal 7, коли ми реалізуємо hook_menu(), ми також можемо додати в меню зареєстровані шляхи, щоб вивести на сайті посилання меню. Знову — таки ця операція більше не обробляється цим зверненням. Замість нього ми використовуємо YML-файл, щоб оголосити посилання меню в якості конфігурації.

Давайте розглянемо, як ми можемо створити посилання, яка відображається в меню Structure панелі адміністрування. По-перше, в корені нашого модуля нам потрібно створити файл з ім’ям demo.menu_links.yml. У цьому YML-файлі ми визначаємо посилання меню і їх положення в існуючих на сайті меню. Для цього, нам потрібно задати наступне:

demo.demo:
title: Demo Link
description: ‘This is a demo link’
parent: system.admin_structure
route_name: demo.demo

Ми знову маємо YML-структуру на основі відступів, в якій ми спочатку визначаємо машинне ім’я посилання меню (demo) для модуля demo (як ми це робили для маршрутів).

Далі, у нас є назва посилання та опис відповідного цим посиланням батьківського елемента (куди вона повинна бути додана) і те, який маршрут вона повинна використовувати.

Значення parent є посиланням батьківського меню (додається модулем), щоб знайти його, вам потрібно трохи покопатися в файлах *.menu_links.yml. Я знаю, що посилання Structure визначається в модулі ядра системи, тому, заглянувши в файл system.menu_links.yml я можу визначити ім’я посилання.

route_name це машинне ім’я маршруту, який ми хочемо використовувати для цього посилання. Ми визначили маршрути раніше. І розібравшись з цим, ви можете очистити кеш і перейти по ссылке http://example.com/admin/structure. Тепер ви повинні побачити нову посилання меню з назвою і описом. За цим посиланням буде здійснюватися перехід по шляху demo/. Непогано.

Висновок

У цій статті ми почали розглядати побудова модуля Drupal 8. На даному етапі (версія системи alpha11) вже настав час приступати до вивчення особливостей роботи з новими компонентами і contrib-модулями.

З цією метою я пропоную вашій увазі своє дослідження цих нових та існуючих раніше функцій фреймворку, яким і стане Drupal 8, щоб ми всі могли заздалегідь підготуватися до підготовлюваних змін, і відразу приступити до роботи, коли настане день релізу.

Для початку, ми розглянули деякі основи елементи: як починається робота по створенню модуля Drupal 8 (файли, структура папок і т. д.), все це в порівнянні з Drupal 7. Ви також побачили, як визначити маршрути і класи контролерів з методами, які викликаються цими маршрутами.

І, нарешті, ми розглянули, як створити посилання меню, використовуючи маршрут, який ми визначили.

У наступній статті ми продовжимо побудова цього модуля і розглянемо деякі інші цікаві нові компоненти Drupal 8. Я розповім вам, як ми можемо створювати блоки і як працювати з формами і системою конфігурації. Незабаром побачимося.

Переклад статті «Build a Drupal 8 Module: Routing, Controllers and Menu Links» був підготовлений дружною командою проекту Сайтостроение від А до Я.