Ressourcen anpassen
Manche Websites möchten bestimmte JSON:API-Ressourcentypen oder Felder nicht exponieren oder Felder umbenennen, um eine sauberere Schnittstelle bereitzustellen.
Um diese Anpassungen zu ermöglichen, löst JSON:API ein ResourceTypeBuildEvent
-Objekt mit dem Ereignisnamen ResourceTypeBuildEvents::BUILD
aus. Siehe Subscribe to and dispatch events für weitere Informationen zur Nutzung von Events.
Subscriber können folgende Methoden aufrufen:
ResourceTypeBuildEvent::disableResourceType()
– Verhindert, dass ein Ressourcentyp in irgendeiner Weise über JSON:API zugänglich ist.ResourceTypeBuildEvent::disableField()
– Verhindert, dass ein Feld in irgendeiner Weise über JSON:API zugänglich ist.ResourceTypeBuildEvent::setPublicFieldName()
– Setzt einen Alias für ein Feld, sodass JSON:API nicht den internen Drupal-Feldnamen ausgibt.ResourceTypeBuildEvent::setResourceTypeName()
– Setzt einen Alias für einen Ressourcentyp, sodass JSON:API nicht den internen Drupal-Ressourcennamen ausgibt.
Jedes Modul, egal ob benutzerdefiniert oder contrib, kann einen Subscriber für dieses Event implementieren. Das bedeutet, dass ein Modul für eine spezifische Website Ressourcentypen deaktivieren kann und dass Module, die eigene Entity-Typen bereitstellen, deren eigene JSON:API-Repräsentation deaktivieren können.
Beispiel
Nachfolgend ein Beispiel-EventSubscriber
, der alle möglichen Aktionen zeigt:
<?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 zum Anpassen von Ressourcentypen.
*/
class ResourceTypeBuildEventSubscriber implements EventSubscriberInterface {
/**
* {@inheritdoc}
*/
public static function getSubscribedEvents() {
return [
ResourceTypeBuildEvents::BUILD => [
['disableResourceType'],
['aliasResourceTypeFields'],
['disableResourceTypeFields'],
['renameResourceType'],
],
];
}
/**
* Deaktiviert node/page Ressourcentyp.
*
* @param \Drupal\jsonapi\ResourceType\ResourceTypeBuildEvent $event
* Das Build-Event.
*/
public function disableResourceType(ResourceTypeBuildEvent $event) {
if ($event->getResourceTypeName() === 'node--page') {
$event->disableResourceType();
}
}
/**
* Alias für das body-Feld zu content.
*
* @param \Drupal\jsonapi\ResourceType\ResourceTypeBuildEvent $event
* Das 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');
}
}
}
}
/**
* Deaktiviert das sticky-Feld auf node--article.
*
* @param \Drupal\jsonapi\ResourceType\ResourceTypeBuildEvent $event
* Das Build-Event.
*/
public function disableResourceTypeFields(ResourceTypeBuildEvent $event) {
if ($event->getResourceTypeName() === 'node--article') {
foreach ($event->getFields() as $field) {
if ($field->getInternalName() === 'sticky') {
$event->disableField($field);
}
}
}
}
/**
* Benennt node--article zu article um, sodass die Ressource als /jsonapi/article bereitgestellt wird.
*
* @param \Drupal\jsonapi\ResourceType\ResourceTypeBuildEvent $event
* Das Build-Event.
*/
public function renameResourceType(ResourceTypeBuildEvent $event) {
if ($event->getResourceTypeName() === 'node--article') {
$event->setResourceTypeName('article');
}
}
}
JSON:API Extras
Einige dieser Funktionalitäten werden auch von JSON:API Extras bereitgestellt. Dieses Modul versucht, die Core-Funktionen zu nutzen, wo immer möglich, liefert aber eine Benutzeroberfläche und zusätzliche Features wie:
- Anpassen des Basispfads der API.
- Hinzufügen von Enhancers zu Feldern.
- Ressourcen standardmäßig deaktivieren.
Nach dem Aktivieren des Moduls kannst du /admin/config/services/jsonapi besuchen, um eine Liste aller Konfigurationen und Inhalte zu sehen, die durch JSON:API exponiert werden.
Artikel von Drupal Documentation.