Кастомизация ресурсов
Некоторые сайты могут не захотеть раскрывать определённые типы ресурсов или поля 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. Он использует возможности ядра, но добавляет интерфейс конфигурации и дополнительные функции:
- Изменение базового пути API;
- Добавление "улучшателей" (enhancers) для полей;
- Отключение ресурсов по умолчанию.
После установки модуля вы можете перейти по адресу /admin/config/services/jsonapi, чтобы увидеть список всех конфигураций и контента, доступного через JSON:API.
Статья с сайта Drupal Documentation.