logo

パレット - カラフルに🎨

Palette — ビジュアルページビルダー、デザインの専門知識は不要です。

ライブデモ パレットをダウンロード

Scroll
09/04/2025, by Ivan

一部のサイトでは、特定の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でも提供されています。このモジュールは可能な場合はコアの機能を使用するように努めていますが、次のようなインターフェースと追加機能を提供します。

  1. APIへのベースパスの変更。
  2. フィールドへのエンハンサーの追加。
  3. デフォルトでのリソースの無効化。

モジュールを有効にすると、/admin/config/services/jsonapiにアクセスして、JSON:APIが公開するすべての設定とコンテンツの一覧を確認できます。

Drupalドキュメントからの記事です。