Headless Drupal - это одна из наиболее актуальных и интересных идей использования Drupal 8. Данный термин подразумевает разделение backend и frontend, при котором Drupal выступает только в роли серверной части, а «клиентом» может быть любой JavaScript-фреймворк, мобильное приложение, ваш собственный «велосипед» и т.д. Основная идея такого подхода заключается в желании полного контроля над отображением контента без необходимости использования тяжёлой системы рендеринга Drupal.

 

RESTful Drupal

Когда у Drupal забирают frontend часть, он становится веб-сервисом. В отличие от Drupal 7, в Drupal 8 достаточно включения модуля RESTful Web Services (поставляется вместе с ядром) для управления сущностями с помощью REST-запросов. Кроме того, данный модуль позволяет создавать Views, которые будут отдавать контент в REST-формате.

При необходимости интерфейса администрирования REST-ресурсов можно установить модуль REST UI.

 

JSON API

При проектировании RESTful веб-сервисов стоит также обратить внимание на модуль JSON API, который является реализацией одноимённой спецификации, определяющей структуру запросов клиента и ответов сервера при извлечении/изменении ресурсов. Для получения функционала модуля требуется только его включение без какой-либо дополнительной настройки. После включения модуля можно управлять сущностями Drupal с помощью стандартных HTTP-запросов GET, POST, PATCH, и DELETE. Проверка доступа к операциям над сущностями выполняется на основе стандартной системы разрешений Drupal.

Следует понимать, что JSON API полностью основан на сущностях, поэтому его нельзя использовать для операций, не связанных с «CRUD». К примеру, регистрация новой учётной записи, авторизация пользователя или запрос нового пароля не являются частью JSON API. Подобные операции следует выполнять с помощью функционала, который предоставляется ядром Drupal.

Расширить функционал JSON API можно с помощью модулей JSON API Extras и JSON API Defaults. Первый даёт возможность тонкой настройки предоставляемых ресурсов, а второй позволяет задать ресурсам простые пути без нагромождения большого количества URL-параметров.

Кстати, в скором времени модуль JSON API может быть добавлен в состав ядра Drupal 8.

 

Интеграция React и Drupal модуля

В случае интеграции React с модулем Drupal речь идёт об использовании React-компонентов в функционале модуля. Сгенерированные JavaScript-файлы подключаются с помощью библиотек.

example:
  version: VERSION
  js:
    js/bundle/first.bundle.js: {}
    js/bundle/second.bundle.js: {}
$build['#attached']['library'][] = 'example_module/example';

«Общение» компонента с сервером реализуется на основе REST-ресурсов, для определения которых имеет смысл использовать связку модулей RESTful Web Services и JSON API. Рассмотрим несколько примеров запросов к ресурсам (код приведён в формате HTTP).

Создать пользователя

POST /entity/user?_format=json HTTP/1.1
Host: drupal8.example
Content-Type: application/json
 
{
  "name": [{ "value": "user@mail.example" }],
  "pass": [{ "value": "thebestpassword" }],
  "status": [{ "value": true }]
}

Авторизовать пользователя

POST /user/login?_format=json HTTP/1.1
Host: drupal8.example
Content-Type: application/json
 
{"name": "user@mail.example", "pass": "thebestpassword"}

Получить токен сессии

GET /session/token HTTP/1.1
Host: drupal8.example

Выйти из текущего аккаунта

POST /user/logout?_format=json HTTP/1.1
Host: drupal8.example
Content-Type: application/json

Получить информацию о пользователе с определённым Email

GET /jsonapi/user/user?filter[mail][value]=user@mail.example HTTP/1.1
Host: drupal8.example

Получить ближайшие 10 опубликованных статей

GET /jsonapi/node/article?filter[status][value]=1&sort=-created&page[limit]=10 HTTP/1.1
Host: drupal8.example

 

RESTful Commerce

Отдельно стоит отметить управление REST-ресурсами для Commerce. Все данные, представляющие собой сущности могут быть получены с помощью JSON API. Однако для корзины в Commerce не определены REST-ресурсы и она не является сущностью, поэтому взаимодействовать с ней подобным образом нельзя. В данном случае следует использовать модуль Commerce Cart API, который предоставляет REST-ресурсы для получения корзины, а также добавления и удаления позиций.

В заключении рассмотрим несколько примеров запросов к ресурсам Commerce (код приведён в формате HTTP).

Получить информацию о товаре, включая вариации, по его ID

GET /jsonapi/commerce_product/product?filter[product_id][value]=1&include=variations HTTP/1.1
Host: drupal8.example

Получить список завершённых заказов

GET /jsonapi/commerce_order/default?filter[state][value]=completed HTTP/1.1
Host: drupal8.example

Получить информацию о корзине

GET /cart?_format=json HTTP/1.1
Host: drupal8.example

Добавить товар в корзину

POST /cart/add?_format=json HTTP/1.1
Host: drupal8.example
Content-Type: application/json
 
[
  {
    "purchased_entity_type": "commerce_product_variation",
    "purchased_entity_id": "1"
  },
  {
    "purchased_entity_type": "commerce_product_variation",
    "purchased_entity_id": "2"	
  }
]

Удалить товар из корзины

DELETE /cart/2/items/10?_format=json HTTP/1.1
Host: drupal8.example

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