Scroll
リソースのカスタマイズ
一部のサイトでは、特定のJSON:APIリソースタイプやフィールドを公開したくない場合や、よりクリーンなインターフェースを提供するためにフィールドをリネームしたい場合があります。
これらの変更を可能にするために、JSON:APIはResourceTypeBuildEvents::BUILDというイベント名でResourceTypeBuildEventイベントオブジェクトをディスパッチします。これらのイベントの使用方法については、イベントのサブスクライブとディスパッチを参照してください。
サブスクライバーは次のメソッドを呼び出すことができます。
ResourceTypeBuildEvent::disableResourceType()JSON:API経由でリソースタイプに一切アクセスできないようにします。ResourceTypeBuildEvent::disableField()JSON:API経由でフィールドに一切アクセスできないようにします。ResourceTypeBuildEvent::setPublicFieldName()JSON:APIが内部のDrupalフィールド名を公開しないように、フィールドのエイリアスを設定します。ResourceTypeBuildEvent::setResourceTypeName()JSON:APIが内部のDrupalリソース名を公開しないように、リソースのエイリアスを設定します。
カスタムモジュールでもコントリビュートモジュールでも、あらゆるモジュールがこのイベントのサブスクライバーを実装できます。つまり、特定のサイト向けのモジュールはリソースタイプを無効化でき、また独自のエンティティタイプを提供するモジュールは、自身のJSON:API表現を無効化できるということです。
例
以下は、実行できるすべてのアクションを示すEventSubscriberの例です。
<?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 to change some resource types.
*/
class ResourceTypeBuildEventSubscriber implements EventSubscriberInterface {
/**
* {@inheritdoc}
*/
public static function getSubscribedEvents() {
return [
ResourceTypeBuildEvents::BUILD => [
['disableResourceType'],
['aliasResourceTypeFields'],
['disableResourceTypeFields'],
['renameResourceType'],
],
];
}
/**
* Disables node/page resource type.
*
* @param \Drupal\jsonapi\ResourceType\ResourceTypeBuildEvent $event
* The build event.
*/
public function disableResourceType(ResourceTypeBuildEvent $event) {
if ($event->getResourceTypeName() === 'node--page') {
$event->disableResourceType();
}
}
/**
* Aliases the body field to content.
*
* @param \Drupal\jsonapi\ResourceType\ResourceTypeBuildEvent $event
* The 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');
}
}
}
}
/**
* Disables the sticky field on node--article.
*
* @param \Drupal\jsonapi\ResourceType\ResourceTypeBuildEvent $event
* The build event.
*/
public function disableResourceTypeFields(ResourceTypeBuildEvent $event) {
if ($event->getResourceTypeName() === 'node--article') {
foreach ($event->getFields() as $field) {
if ($field->getInternalName() === 'sticky') {
$event->disableField($field);
}
}
}
}
/**
* Renames node--article to article, exposing the resource as /jsonapi/article
*
* @param \Drupal\jsonapi\ResourceType\ResourceTypeBuildEvent $event
* The build event.
*/
public function renameResourceType(ResourceTypeBuildEvent $event) {
if ($event->getResourceTypeName() === 'node--article') {
$event->setResourceTypeName('article');
}
}
}
JSON:API Extras
この機能の一部はJSON:API Extrasでも提供されています。このモジュールは可能な場合はコアの機能を使用するように努めていますが、次のようなインターフェースと追加機能を提供します。
- APIへのベースパスの変更。
- フィールドへのエンハンサーの追加。
- デフォルトでのリソースの無効化。
モジュールを有効にすると、/admin/config/services/jsonapiにアクセスして、JSON:APIが公開するすべての設定とコンテンツの一覧を確認できます。
Drupalドキュメントからの記事です。