Resources aanpassen
Sommige sites willen bepaalde JSON:API-resourcetypen of velden niet exposen of willen velden hernoemen om een schonere interface te bieden.
Om deze aanpassingen mogelijk te maken, dispatcht JSON:API een ResourceTypeBuildEvent
-eventobject met de eventnaam ResourceTypeBuildEvents::BUILD
. Raadpleeg subscribe to and dispatch events voor uitleg over het gebruik van deze events.
Subscribers kunnen de volgende methoden aanroepen:
ResourceTypeBuildEvent::disableResourceType()
om te voorkomen dat een resourcetype op welke manier dan ook via JSON:API kan worden benaderd.ResourceTypeBuildEvent::disableField()
om te voorkomen dat een veld op welke manier dan ook via JSON:API kan worden benaderd.ResourceTypeBuildEvent::setPublicFieldName()
om een veldalias in te stellen zodat JSON:API de interne Drupal-veldnaam niet exposeert.ResourceTypeBuildEvent::setResourceTypeName()
om een resourcealias in te stellen zodat JSON:API de interne Drupal-resourcenaam niet exposeert.
Elke module, custom of contrib, kan een subscriber voor dit event implementeren. Dat betekent dat een module voor een specifieke site resourcetypen kan uitschakelen en dat modules die eigen entiteitstypen leveren ook hun eigen JSON:API-representaties kunnen uitschakelen.
Example
Hieronder staat een voorbeeld van een EventSubscriber
dat alle mogelijke acties toont die je kunt uitvoeren.
<?php
namespace Drupal\modules\custom\resource_types\EventSubscriber;
use Drupal\jsonapi\ResourceType\ResourceTypeBuildEvents;
use Drupal\jsonapi\ResourceType\ResourceTypeBuildEvent;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
/**
* Event-subscriber om enkele resourcetypen te wijzigen.
*/
class ResourceTypeBuildEventSubscriber implements EventSubscriberInterface {
/**
* {@inheritdoc}
*/
public static function getSubscribedEvents() {
return [
ResourceTypeBuildEvents::BUILD => [
['disableResourceType'],
['aliasResourceTypeFields'],
['disableResourceTypeFields'],
['renameResourceType'],
],
];
}
/**
* Schakelt het resourcetype node/page uit.
*
* @param \Drupal\jsonapi\ResourceType\ResourceTypeBuildEvent $event
* Het build-event.
*/
public function disableResourceType(ResourceTypeBuildEvent $event) {
if ($event->getResourceTypeName() === 'node--page') {
$event->disableResourceType();
}
}
/**
* Maakt een alias voor het body-veld als 'content'.
*
* @param \Drupal\jsonapi\ResourceType\ResourceTypeBuildEvent $event
* Het build-event.
*/
public function aliasResourceTypeFields(ResourceTypeBuildEvent $event) {
if ($event->getResourceTypeName() === 'node--article') {
foreach ($event->getFields() as $field) {
if ($field->getInternalName() === 'body') {
$event->setPublicFieldName($field, 'content');
}
}
}
}
/**
* Schakelt het veld 'sticky' uit op node--article.
*
* @param \Drupal\jsonapi\ResourceType\ResourceTypeBuildEvent $event
* Het build-event.
*/
public function disableResourceTypeFields(ResourceTypeBuildEvent $event) {
if ($event->getResourceTypeName() === 'node--article') {
foreach ($event->getFields() as $field) {
if ($field->getInternalName() === 'sticky') {
$event->disableField($field);
}
}
}
}
/**
* Hernoemt node--article naar article, zodat de resource als /jsonapi/article wordt geëxposeerd.
*
* @param \Drupal\jsonapi\ResourceType\ResourceTypeBuildEvent $event
* Het build-event.
*/
public function renameResourceType(ResourceTypeBuildEvent $event) {
if ($event->getResourceTypeName() === 'node--article') {
$event->setResourceTypeName('article');
}
}
}
JSON:API Extras
Een deel van deze functionaliteit wordt ook geleverd door JSON:API Extras. Deze module probeert waar mogelijk de core-functionaliteit te gebruiken, maar levert een interface en enkele extra features zoals:
- Het basispad van de API aanpassen.
- Enhancers toevoegen aan velden.
- Resources standaard uitschakelen.
Na het inschakelen van de module kun je /admin/config/services/jsonapi bezoeken om een lijst te zien van alle configuratie en content die door JSON:API wordt geëxposeerd.
Artikel uit Drupal-documentatie.