2019/12/10

GraphQL をつかって Craft CMS のデータを取得してみる #craftcms

このエントリは Craft CMS Advent Calendar 2019 10日目のエントリーです。
昨日は代打エントリで「Craft CMS で CLI でプラグインを削除するのは composer remove」でした。


Craft CMS 3.3 では GraphQL をつかってデータの取得ができる。

公式ドキュメントにもいくつか取得を試してみる方法が解説されている。

GraphQL API | Craft 3 Documentation
https://docs.craftcms.com/v3/g...

GraphiQL IDE を使って確認する

一番簡単なのは Craft 自体に入っている GraphiQL IDE を使う方法。

GraphQL に慣れてる人にとってはすぐ使い始められると思う。

GraphQL Playground online を使って確認する

あとは GraphQL Playground online を使う方法もある。

Endpoint のURLを入力する。

これは routes.php で書いた設定によるが

<?php
return [
    'api' => 'graphql/api',
];

こんな感じになってれば https://example.com/api ということになる。

Create Your API Endpoint
https://docs.craftcms.com/v3/g...

これでレスポンスなどの確認が可能になる。

アプリを利用して確認する

あとはアプリなどを利用する方法もある。

公式サイトでは Insomnia が紹介されている。

Insomnia REST Client
https://insomnia.rest/

以前、 Altair GraphQL Client を試してみたのはブログに書いた。

GraphiQL IDE などだいたいがサジェストしてくれるので初めてでも使いやすい。

疎通確認のQuery

簡単な疎通確認だけなら、 こんなかんじで

query{
  ping
}

このように返ってくる

{
  "data": {
    "ping": "pong"
  }
}

データ取得の Query

シンプルにエントリのデータを取得する場合はこのような感じになる。

query{
  entries{
    id
    title
  }
}

1つのqueryの中で複数のセクションのエントリをとったりすることもあると思うので、そういうのはこんな感じになる。

query {
	news: entries(section: "news",status: "live") {
		title
		slug
	}
	product: entries(section: "product",status: "live") {
		title
		slug
		id
	}
}

公開スキーマとプライベートスキーマ

エンドポイントを叩いてなんでも取れてしまうとセキュリティ的にもよろしくないので、その辺りは Craft CMS 側でスキーマを作成する。

デフォルトでは公開スキーマが1つあるので、ここで設定したものは認証なく取得が可能になる。

通常使わなければここは無効にしておけば良いと思う。

通常はプライベートなスキーマを用意して、 token を投げる形で利用することになる。

ここで作成したスキーマについてのトークンをアクセスするときのヘッダにつけることになる。

GraphQL Playground online だとこんな感じで設定する。

{"Authorization" : "Bearer APIキー"}

入力タイプのデータの取り出し

エントリのid, title といったメタ的な情報はそのままqueryにつなげれば取れるが、他のフィールドは入力タイプの中にはいってくる。

...on news_news_Entry{
something
}

のような感じで

<セクションhandle>_<入力タイプhandle>_Entry

という風に設定して取り出していく。

matrix フィールドの取り出し

matrix フィールドも似たような感じで

<$matrixfield handle$>{
    ...on <$field handle$>_<$block handle$>_BlockType{
        <$field handle$>
    }
}

このように取り出していく感じになる。

ちゃんとドキュメントを読む必要もあるが、GraphQLの使い方もそうだし、 Craft CMS の GraphQL の扱い方も慣れる必要がありそう。