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が表示されます。

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

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

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

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に関するお問い合わせも随時受け付けておりますので、何かございましたら弊社までお問い合わせください。




