logo

Extra Block Types (EBT) - Nueva experiencia con Layout Builder❗

Extra Block Types (EBT): tipos de bloques con estilo y personalizables: Presentaciones de diapositivas, Pestañas, Tarjetas, Acordeones y muchos más. Configuraciones integradas para fondo, DOM Box y plugins de JavaScript. Experimenta hoy el futuro de la construcción de diseños.

Módulos de demostración EBT Descargar módulos EBT

❗Extra Paragraph Types (EPT) - Nueva experiencia con Paragraphs

Extra Paragraph Types (EPT): conjunto de módulos basado en párrafos de forma análoga.

Módulos de demostración EPT Descargar módulos EPT

Scroll
18/05/2025, by Ivan

Algunos sitios pueden no querer exponer ciertos tipos de recursos o campos de JSON:API, o pueden querer renombrar campos para ofrecer una interfaz más limpia.

Para permitir estas alteraciones, JSON:API despacha un objeto de evento ResourceTypeBuildEvent usando el nombre de evento ResourceTypeBuildEvents::BUILD. Consulta suscribirse y despachar eventos para saber cómo usar estos eventos.

Los suscriptores pueden llamar a los siguientes métodos:

  • ResourceTypeBuildEvent::disableResourceType() para evitar que un tipo de recurso sea accesible de cualquier forma vía JSON:API.
  • ResourceTypeBuildEvent::disableField() para evitar que un campo sea accesible de cualquier forma vía JSON:API.
  • ResourceTypeBuildEvent::setPublicFieldName() para establecer un alias a un campo, de modo que JSON:API no exponga el nombre interno del campo de Drupal.
  • ResourceTypeBuildEvent::setResourceTypeName() para establecer un alias de tipo de recurso, de modo que JSON:API no exponga el nombre interno del recurso de Drupal.

Cualquier módulo, personalizado o contribuido, puede implementar un suscriptor para este evento. Esto significa que un módulo para un sitio específico puede deshabilitar tipos de recursos y que los módulos que proporcionan sus propios tipos de entidad pueden deshabilitar sus propias representaciones JSON:API.

Ejemplo

A continuación se muestra un ejemplo de EventSubscriber que muestra todas las acciones posibles que puedes realizar.

<?php

namespace Drupal\modules\custom\resource_types\EventSubscriber;

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

/**
 * Suscriptor de eventos para modificar algunos tipos de recursos.
 */
class ResourceTypeBuildEventSubscriber implements EventSubscriberInterface {

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

  /**
   * Deshabilita el tipo de recurso node/page.
   *
   * @param \Drupal\jsonapi\ResourceType\ResourceTypeBuildEvent $event
   *   El evento de construcción.
   */
  public function disableResourceType(ResourceTypeBuildEvent $event) {
    if ($event->getResourceTypeName() === 'node--page') {
      $event->disableResourceType();
    }
  }

  /**
   * Alias del campo body a content.
   *
   * @param \Drupal\jsonapi\ResourceType\ResourceTypeBuildEvent $event
   *   El evento de construcción.
   */
  public function aliasResourceTypeFields(ResourceTypeBuildEvent $event) {
    if ($event->getResourceTypeName() === 'node--article') {
      foreach ($event->getFields() as $field) {
        if ($field->getInternalName() === 'body') {
          $event->setPublicFieldName($field, 'content');
        }
      }
    }
  }

  /**
   * Deshabilita el campo sticky en node--article.
   *
   * @param \Drupal\jsonapi\ResourceType\ResourceTypeBuildEvent $event
   *   El evento de construcción.
   */
  public function disableResourceTypeFields(ResourceTypeBuildEvent $event) {
    if ($event->getResourceTypeName() === 'node--article') {
      foreach ($event->getFields() as $field) {
        if ($field->getInternalName() === 'sticky') {
          $event->disableField($field);
        }
      }
    }
  }

  /**
   * Renombra node--article a article, exponiendo el recurso como /jsonapi/article
   *
   * @param \Drupal\jsonapi\ResourceType\ResourceTypeBuildEvent $event
   *   El evento de construcción.
   */
  public function renameResourceType(ResourceTypeBuildEvent $event) {
    if ($event->getResourceTypeName() === 'node--article') {
      $event->setResourceTypeName('article');
    }
  }

}

JSON:API Extras

Parte de esta funcionalidad también se encuentra en JSON:API Extras. Este módulo intenta usar la funcionalidad principal cuando es posible, pero también proporciona una interfaz y algunas características extra como:

  1. Alterar la ruta base (basepath) de la API.
  2. Añadir "enhancers" a los campos.
  3. Deshabilitar recursos por defecto.

Después de habilitar el módulo, puedes visitar /admin/config/services/jsonapi para ver una lista de toda la configuración y contenido expuesto por JSON:API.

Artículo de la Documentación de Drupal.