RESTful Web Services と REST UIで始めるDrupal8 REST API入門2

前回、RESTful Web Services と REST UIで始めるDrupal8 REST API入門として Drupalコアに含まれているRESTリソースの有効化及びREST APIを叩いた際のレスポンス等の確認を行いました。

今回は、RESTのプラグインとして独自にAPIを実装し動作確認を行いたいと思います。
試しに基本ページコンテンツタイプ(コンテンツタイプID = 'page')の一覧を取得するプラグインを作成します。

モジュール構成

/modules/custom ディレクトリ以下に下記構成でモジュールを作成します。

d8_rest_api_example
├── d8_rest_api_example.info.yml  # Drupalにモジュールを認識させる為のinfo.yml
└── src
    └── Plugin
        └── rest
            └── resource
                └── PageList.php  # RESTプラグイン

モジュール情報ファイル(d8_rest_api_example.info.yml)

モジュール情報ファイルは以下の通りです。

name: Drupal8 REST API example
description: REST API を利用したカスタムモジュール

type: module
core: 8.x

dependencies:
  - rest

RESTプラグインファイル(PageList.php)

RESTプラグインのソースは以下になります。ソースの中で特に重要となる箇所は以下の通り。

  • namespace…このネームスペースを指定することにより、RESTプラグインとしてDrupalが認識します。
  • アノテーション… @RestResource を適切にしていすることにより、RESTプラグインとして機能します。
    • id... RESTプラグインのユニークなIDです。
    • label...REST UIの管理画面に表示される、説明文です。
    • uri_paths... canonical はGETでアクセスする際のURLを定義します。
      create を指定するとPOST(patch/delete)アクセス時のパスを指定可能です。
  • get() 関数... GETでアクセスが来た際の処理を定義します。同様に post() patch() delete() 関数も定義可能です。
<?php

namespace Drupal\d8_rest_api_example\Plugin\rest\resource;

/**
 * @file
 * 基本ページコンテンツタイプのノード一覧を返すRESTプラグイン.
 */

use Drupal\Core\Cache\CacheableMetadata;
use Drupal\node\Entity\NodeType;
use Drupal\rest\Plugin\ResourceBase;
use Drupal\rest\ResourceResponse;

/**
 * Class Page.
 *
 * @RestResource(
 *   id = "page_resource",
 *   label = "基本ページのノード一覧を返すAPI",
 *   uri_paths = {
 *     "canonical" = "/page"
 *   }
 * )
 */
class PageList extends ResourceBase {

  /**
   * 基本ページのノード一覧を返すGETリクエストの処理.
   *
   * @return \Drupal\rest\ResourceResponse
   *   レスポンス.
   */
  public function get() {
    try {
      // 基本ページ(コンテンツタイプ='page')コンテンツタイプの存在チェック.
      if (empty(NodeType::load('page'))) {
        throw new \Exception('Content Types Not Found.');
      }

      // デフォルトのレスポンスデータ定義.
      $results = [
        'count' => 0,
        'data' => [],
      ];

      // 基本ページ(コンテンツタイプ='page')のノード取得.
      $nodes = \Drupal::entityTypeManager()->getStorage('node')->loadByProperties(['type' => 'page']);
      // 取得件数をレスポンスデータにセット.
      $results['count'] = count($nodes);
      // 取得したノードより必要な情報を取り出す.
      foreach ($nodes as $node) {
        $results['data'][] = [
          'nid' => $node->id(),
          'title' => $node->label(),
        ];
      }

      // レスポンスデータをセット.
      $response = new ResourceResponse($results);

      // キャッシュ無効化.
      $disable_cache = new CacheableMetadata();
      $disable_cache->setCacheMaxAge(0);
      $response->addCacheableDependency($disable_cache);

      return $response;
    }
    catch (\Exception $e) {
      // エラー発生時はエラーレスポンスを返す.
      $response = ['error' => $e->getMessage()];
      return new ResourceResponse($response, 403);
    }
  }

}

REST UI 管理画面

モジュールを有効化すると以下の通り、管理画面( /admin/config/services/rest )上に定義したAPIが表示されます。
REST2_1.png

次に「有効」ボタンをクリックしメソッドや受け付けるフォーマット等を指定します。
REST2_2.png

有効化すると、「有効」に当APIが表示されます。
REST2_3.png

最後にOperationsの「権限」より、当APIへアクセスできる権限を設定します。
(例として匿名ユーザでもアクセス可能としています。実際は運用に合わせ権限を正しく設定してください。)
REST2_4.png

REST API の実行

事前に基本ページのコンテンツを3つ作成した状態で、今回定義したAPIを実行すると
以下の通り、実行結果が取得できます。

# curl '/page?_format=json' | jq .                                                                                                                                                                                                 10:45:20
{
  "count": 3,
  "data": [
    {
      "nid": "1",
      "title": "test"
    },
    {
      "nid": "2",
      "title": "test2"
    },
    {
      "nid": "3",
      "title": "test3"
    }
  ]
}

このように独自APIもRESTプラグインを利用することにより簡単に構築できます。
Drupal8でAPIを実装されたい方はご参考にしてください。

また、弊社ではDrupalは慣れていないが、APIとして利用したい等のご相談も受け付けております。
その他Drupalに関するお問い合わせも随時受け付けておりますので、何かございましたら弊社までお問い合わせください。


共に働く新しい仲間を
募集しています

スタジオ・ウミは「Drupal」に特化したサービスを提供する Drupal のエキスパートチーム。
フルリモート&フレックス制だから、働く場所を選ばず時間の使い方も自由です。
そんなワークライフバランスの整った環境で、当ブログに書かれているような
様々な技術を共に学びながら、Drupalサイト開発に携わってみたい方を募集しています。
まずはお話だけでも大歓迎!ぜひお気軽にご連絡ください。