logo

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

Personalizzazione delle risorse

04/09/2025, by Ivan

Alcuni siti potrebbero non voler esporre determinati tipi di risorsa o campi di JSON:API oppure potrebbero voler rinominare i campi per offrire un’interfaccia più pulita.

Per consentire queste modifiche, JSON:API emette (dispatch) un oggetto evento ResourceTypeBuildEvent usando il nome dell’evento ResourceTypeBuildEvents::BUILD. Fai riferimento a sottoscrivere ed emettere eventi per come utilizzare questi eventi.

I subscriber possono chiamare i seguenti metodi:

  • ResourceTypeBuildEvent::disableResourceType() per impedire che un tipo di risorsa sia accessibile in qualsiasi modo tramite JSON:API.
  • ResourceTypeBuildEvent::disableField() per impedire che un campo sia accessibile in qualsiasi modo tramite JSON:API.
  • ResourceTypeBuildEvent::setPublicFieldName() per impostare un alias di campo in modo che JSON:API non esponga il nome interno del campo di Drupal.
  • ResourceTypeBuildEvent::setResourceTypeName() per impostare un alias di risorsa in modo che JSON:API non esponga il nome interno della risorsa di Drupal.

Qualsiasi modulo, custom o contrib, può implementare un subscriber per questo evento. Ciò significa che un modulo per un sito specifico può disabilitare tipi di risorsa e che i moduli che forniscono propri entity type possono disabilitare le proprie rappresentazioni JSON:API.

Esempio

Di seguito un esempio di EventSubscriber che mostra tutte le azioni possibili.

<?php

namespace Drupal\modules\custom\resource_types\EventSubscriber;

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

/**
 * Subscriber di evento per modificare alcuni tipi di risorsa.
 */
class ResourceTypeBuildEventSubscriber implements EventSubscriberInterface {

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

  /**
   * Disabilita il tipo di risorsa node/page.
   *
   * @param \Drupal\jsonapi\ResourceType\ResourceTypeBuildEvent $event
   *   L'evento di build.
   */
  public function disableResourceType(ResourceTypeBuildEvent $event) {
    if ($event->getResourceTypeName() === 'node--page') {
      $event->disableResourceType();
    }
  }

  /**
   * Imposta un alias del campo body a content.
   *
   * @param \Drupal\jsonapi\ResourceType\ResourceTypeBuildEvent $event
   *   L'evento di build.
   */
  public function aliasResourceTypeFields(ResourceTypeBuildEvent $event) {
    if ($event->getResourceTypeName() === 'node--article') {
      foreach ($event->getFields() as $field) {
        if ($field->getInternalName() === 'body') {
          $event->setPublicFieldName($field, 'content');
        }
      }
    }
  }

  /**
   * Disabilita il campo sticky su node--article.
   *
   * @param \Drupal\jsonapi\ResourceType\ResourceTypeBuildEvent $event
   *   L'evento di build.
   */
  public function disableResourceTypeFields(ResourceTypeBuildEvent $event) {
    if ($event->getResourceTypeName() === 'node--article') {
      foreach ($event->getFields() as $field) {
        if ($field->getInternalName() === 'sticky') {
          $event->disableField($field);
        }
      }
    }
  }

  /**
   * Rinomina node--article in article, esponendo la risorsa come /jsonapi/article
   *
   * @param \Drupal\jsonapi\ResourceType\ResourceTypeBuildEvent $event
   *   L'evento di build.
   */
  public function renameResourceType(ResourceTypeBuildEvent $event) {
    if ($event->getResourceTypeName() === 'node--article') {
      $event->setResourceTypeName('article');
    }
  }

}

JSON:API Extras

Parte di questa funzionalità è fornita anche da JSON:API Extras. Questo modulo tenta di utilizzare dove possibile la funzionalità del core ma fornisce un’interfaccia e alcune funzionalità extra come:

  1. Modificare il base path dell’API.
  2. Aggiungere enhancer ai campi.
  3. Disabilitare le risorse per impostazione predefinita.

Dopo aver abilitato il modulo puoi visitare /admin/config/services/jsonapi per vedere l’elenco di tutta la configurazione e dei contenuti esposti da JSON:API.

Articolo tratto dalla Documentazione di Drupal.