Personalizzazione delle risorse
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:
- Modificare il base path dell’API.
- Aggiungere enhancer ai campi.
- 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.