Extra Block Types (EBT) - New Layout Builder experience❗

Extra Block Types (EBT) - styled, customizable block types: Slideshows, Tabs, Cards, Accordions and many others. Built-in settings for background, DOM Box, javascript plugins. Experience the future of layout building today.

Demo EBT modules Download EBT modules

❗Extra Paragraph Types (EPT) - New Paragraphs experience

Extra Paragraph Types (EPT) - analogical paragraph based set of modules.

Demo EPT modules Download EPT modules

Scroll

Кастомизация ресурсов

20/04/2025, by Ivan

Некоторые сайты могут не захотеть раскрывать определённые типы ресурсов или поля JSON:API, либо могут захотеть переименовать поля для упрощённого интерфейса.

Для таких изменений модуль JSON:API предоставляет событие ResourceTypeBuildEvent с именем ResourceTypeBuildEvents::BUILD. Подробнее о работе с событиями см. Создание и подписка на события.

Подписчики могут вызывать следующие методы:

  • disableResourceType() — полностью отключить доступ к ресурсу через JSON:API;
  • disableField() — отключить доступ к отдельному полю через JSON:API;
  • setPublicFieldName() — задать публичное имя поля вместо внутреннего имени Drupal;
  • setResourceTypeName() — задать публичное имя ресурса вместо внутреннего имени типа сущности.

Любой модуль — как кастомный, так и сторонний — может реализовать подписчика на это событие. Таким образом, можно отключить ресурсы или поля как на уровне сайта, так и на уровне модуля, предоставляющего тип сущности.

Пример

Ниже представлен пример EventSubscriber, демонстрирующий все возможные действия:

<?php

namespace Drupal\modules\custom\resource_types\EventSubscriber;

use Drupal\jsonapi\ResourceType\ResourceTypeBuildEvents;
use Drupal\jsonapi\ResourceType\ResourceTypeBuildEvent;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;

/**
 * Подписчик события для изменения ресурсов JSON:API.
 */
class ResourceTypeBuildEventSubscriber implements EventSubscriberInterface {

  public static function getSubscribedEvents() {
    return [
      ResourceTypeBuildEvents::BUILD => [
        ['disableResourceType'],
        ['aliasResourceTypeFields'],
        ['disableResourceTypeFields'],
        ['renameResourceType'],
      ],
    ];
  }

  // Отключить доступ к node--page
  public function disableResourceType(ResourceTypeBuildEvent $event) {
    if ($event->getResourceTypeName() === 'node--page') {
      $event->disableResourceType();
    }
  }

  // Переименовать поле body → content для node--article
  public function aliasResourceTypeFields(ResourceTypeBuildEvent $event) {
    if ($event->getResourceTypeName() === 'node--article') {
      foreach ($event->getFields() as $field) {
        if ($field->getInternalName() === 'body') {
          $event->setPublicFieldName($field, 'content');
        }
      }
    }
  }

  // Отключить поле sticky для node--article
  public function disableResourceTypeFields(ResourceTypeBuildEvent $event) {
    if ($event->getResourceTypeName() === 'node--article') {
      foreach ($event->getFields() as $field) {
        if ($field->getInternalName() === 'sticky') {
          $event->disableField($field);
        }
      }
    }
  }

  // Переименовать node--article → article (доступ по /jsonapi/article)
  public function renameResourceType(ResourceTypeBuildEvent $event) {
    if ($event->getResourceTypeName() === 'node--article') {
      $event->setResourceTypeName('article');
    }
  }

}

JSON:API Extras

Часть описанного функционала также реализуется в модуле JSON:API Extras. Он использует возможности ядра, но добавляет интерфейс конфигурации и дополнительные функции:

  1. Изменение базового пути API;
  2. Добавление "улучшателей" (enhancers) для полей;
  3. Отключение ресурсов по умолчанию.

После установки модуля вы можете перейти по адресу /admin/config/services/jsonapi, чтобы увидеть список всех конфигураций и контента, доступного через JSON:API.

Статья с сайта Drupal Documentation.