Personalización de recursos
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:
- Alterar la ruta base (basepath) de la API.
- Añadir "enhancers" a los campos.
- 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.