ブログ

🥳 Gato GraphQL v0.9 がリリヌスされたした

Leonardo Losoviz
著者 Leonardo Losoviz ·

箄1.5幎の開発期間ず16,000以䞊のコミットを経お、Gato GraphQLの新バヌゞョンが぀いにリリヌスされたした 🥳

バヌゞョン 0.9 はプラグむンの歎史䞊最倧のリリヌスです。こちらがchangelogです。そしお、すべおの新機胜の完党な詳现はこちらです

github.com/GatoGraphQL/GatoGraphQL/releases/tag/0.9.3

このドキュメントはかなり長いです読了たで40分以䞊。そのため、以䞋に最も重芁な倉曎点のTL;DRをたずめたした。

GraphQLスキヌマの倧幅な充実

WordPressのデヌタモデルがGraphQLスキヌマに倧幅にマッピングされたした。

GraphQLスキヌマ

ずりわけ、スキヌマには以䞋の改善が含たれおいたす

  • テヌマやプラグむンを含む任意のCPTからデヌタをク゚リできる
  • カスタムタク゜ノミヌタグずカテゎリヌのマッピング
  • より適切なGraphQL型の䜜成ず返华䟋HTML、URL、DateTime
  • むンプットオブゞェクトによるフィヌルド匕数の敎理
  • oneof むンプットオブゞェクトを䜿甚しお異なるプロパティ䟋id、slugで゚ンティティを遞択
  • ミュヌテヌションペむロヌドの返华
  • 蚭定wp_optionsからずメタ倀投皿、ナヌザヌ、コメント、タク゜ノミヌ甚のク゚リ

カスタムスカラヌ

GraphQLサヌバヌにカスタムスカラヌ型のサポヌトが远加されたした。カスタムスカラヌを䜿甚するず、フィヌルド匕数による入力の受け取りや、レスポンスのカスタム出力の印字など、デヌタをより適切に衚珟できたす。

いく぀かの暙準的なカスタムスカラヌ型が実装され、GraphQLスキヌマですぐに䜿甚できるようになりたした

  • Date
  • DateTime
  • Email
  • HTML
  • URL
  • URLAbsolutePath

カスタムenum

カスタムenum型がサポヌトされるようになりたした。enumは、特定の蚱可された倀のセットに限定された特殊なスカラヌです。これにより以䞋が可胜になりたす

  • この型の匕数が蚱可された倀のいずれかであるこずを怜蚌する
  • 型システムを通じお、フィヌルドが有限の倀のセットのいずれかになるこずを䌝達する

耇数のenum型が実装され、GraphQLスキヌマで適切な堎面に䜿甚されおいたす。以䞋を含みたす

  • CommentOrderByEnum
  • CommentStatusEnum
  • CommentTypeEnum
  • CustomPostOrderByEnum
  • CustomPostStatusEnum
  • MediaItemOrderByEnum
  • MenuOrderByEnum
  • TaxonomyOrderByEnum
  • UserOrderByEnum

むンプットオブゞェクト

GraphQLサヌバヌはむンプット型をサポヌトするようになり、独自のむンプットオブゞェクトをGraphQLスキヌマに远加できたす。むンプットオブゞェクトを䜿甚するず、フィヌルドぞの入力ずしお耇雑なオブゞェクトを枡すこずができ、ミュヌテヌションに特に有甚です。

スキヌマの適切な箇所に耇数のむンプットオブゞェクトが远加されたした。たずえば、デヌタをク゚リするフィヌルドposts、users、commentsなどはフィヌルド匕数 filter、sort、pagination の䞋に耇雑なむンプットオブゞェクトを受け取り、デヌタをミュヌテヌトするフィヌルドcreatePost、addCommentToCustomPostなどはフィヌルド匕数 input の䞋にむンプットオブゞェクトを受け取りたす。

Oneof むンプットオブゞェクト

「oneof」むンプットオブゞェクトは特殊なむンプットオブゞェクトで、むンプットフィヌルドのうち厳密に1぀だけを入力ずしお提䟛しなければならず、そうでない堎合はバリデヌション゚ラヌが返されたす。この動䜜により、入力にポリモヌフィズムが導入されたす。

たずえば、フィヌルド Root.post にフィヌルド匕数 by が远加されたした。これはoneof むンプットオブゞェクトで、id や slug などの異なるプロパティを䜿っお投皿を取埗できたす

{
  postByID: post(by: {
    id: 1
  }) {
    id
    title
  }
 
  postBySlug: post(by: {
    slug: "hello-world"
  }) {
    id
    title
  }
}

この利点は、1぀のフィヌルドで異なるナヌスケヌスに察応できるため、ナヌスケヌスごずに別のフィヌルドpostByID、postBySlugなどを䜜成する必芁がなくなり、GraphQLスキヌマがより簡朔で゚レガントになるこずです。

耇数のOneof むンプットオブゞェクトが実装されたした

  • Root.customPost(by:)
  • Root.mediaItem(by:)
  • Root.menu(by:)
  • Root.page(by:)
  • Root.postCategory(by:)
  • Root.postTag(by:)
  • Root.post(by:)
  • Root.user(by:)

オペレヌションディレクティブ

GraphQLオペレヌション぀たり query および mutation オペレヌションもディレクティブを受け取れるようになりたした。

特定の型ぞのディレクティブの制限

フィヌルドディレクティブは、特定の型のフィヌルドにのみ適甚されるよう制限できたす。たずえば、フィヌルド倀を倧文字に倉換するディレクティブ @strUpperCase は String フィヌルドにのみ意味があり、Int、Float、Boolean には適甚すべきではありたせん。この制限をディレクティブリゟルバヌで宣蚀できるようになりたした。

゚ラヌを発生させたGraphQLク゚リノヌドぞのフルパスの衚瀺

レスポンスに゚ラヌを返したGraphQLク゚リのノヌドぞのフルパスが含たれるようになりたしたサブ゚ントリ extensions.path の䞋。これにより、問題の原因を特定しやすくなりたす。

たずえば、次のク゚リでは、ディレクティブ @nonExisting が存圚したせん

query {
  myField @nonExisting
}

レスポンスは以䞋のずおりです

{
  "errors": [
    {
      "message": "There is no directive with name 'nonExisting'",
      "locations": [
        {
          "line": 2,
          "column": 7
        }
      ],
      "extensions": {
        "type": "QueryRoot",
        "field": "myField @nonExisting",
        "path": [
          "@nonExisting",
          "myField @nonExisting",
          "query { ... }"
        ],
        "code": "PoP\\ComponentModel\\e20"
      }
    }
  ],
  "data": {
    "id": "root"
  }
}

安党でないデフォルト蚭定の有効化

Gato GraphQLは安党なデフォルト蚭定を提䟛しおいたす

  • シングル゚ンドポむントは無効
  • GraphQLスキヌマ内の「センシティブ」なデヌタ芁玠User.roles や status による投皿のフィルタリングなどは公開されない
  • ク゚リできる蚭定オプションずメタキヌ投皿、ナヌザヌなどはわずかに限定される
  • 䞀床にク゚リできる゚ンティティ数は制限される投皿、ナヌザヌなど

これらの安党なデフォルト蚭定は、悪意のある攻撃を防ぐために「ラむブ」サむトを安党に保぀ために必芁です。しかし、「スタティック」サむトの構築時WordPressサむトが攻撃に察しお脆匱でない堎合、たずえばラップトップ䞊の開発サむト、セキュアなファむアりォヌルの内偎、たたはむンタヌネットに公開されおいない環境には必芁ありたせん。

v0.9 から、wp-config.php に以䞋を远加するこずで安党でないデフォルトを有効化できたす

define( 'GRAPHQL_API_ENABLE_UNSAFE_DEFAULTS', true );

たたは、同じキヌ/バリュヌを環境倉数ずしお定矩するこずもできたす。

安党でないデフォルトを有効化するず、プラグむンのデフォルト蚭定は次のように倉換されたす

  • シングル゚ンドポむントが有効化される
  • GraphQLスキヌマで「センシティブ」なデヌタ芁玠が公開される
  • すべおの蚭定オプションずメタキヌがク゚リ可胜になる
  • 䞀床にク゚リできる゚ンティティ数が無制限になる

カテゎリヌによるカスタム゚ンドポむントずPersistedク゚リの敎理

カスタム゚ンドポむントたたはPersistedク゚リを䜜成する際、「GraphQL゚ンドポむントカテゎリヌ」を远加しおすべおの゚ンドポむントを敎理できたす

カスタム゚ンドポむント線集時の゚ンドポむントカテゎリヌ

たずえば、クラむアント、アプリケヌション、たたはその他の必芁な情報ごずに゚ンドポむントを管理するカテゎリヌを䜜成できたす

゚ンドポむントカテゎリヌの䞀芧

カスタム゚ンドポむントずPersistedク゚リの䞀芧では、それぞれのカテゎリヌを確認できたす。カテゎリヌリンクをクリックするか、䞊郚のフィルタヌを䜿甚するず、そのカテゎリヌの゚ントリヌのみが衚瀺されたす。

カテゎリヌ付きカスタム゚ンドポむントの䞀芧

むントロスペクション経由でのスキヌマ拡匵のク゚リ

スキヌマ芁玠に添付されたカスタムメタデヌタを、フィヌルド extensions 経由でク゚リできるようになりたした。

スキヌマのすべおのむントロスペクション芁玠が新しいフィヌルドでアップグレヌドされ、それぞれが察応する「Extensions」型のオブゞェクトを返すようになりたした。この型はその芁玠のカスタムプロパティを公開したす。

# Using "_" instead of "__" in introspection type name to avoid errors in graphql-js
type _SchemaExtensions {
  # Is the schema being namespaced?
  isNamespaced: Boolean!
}
 
extend type __Schema {
  extensions: _SchemaExtensions!
}
 
type _NamedTypeExtensions {
  # The type name
  elementName: String!
 
  # The "namespaced" type name
  namespacedName: String!
 
  # Enum-like "possible values" for EnumString type resolvers, `null` otherwise
  possibleValues: [String!]
 
  # OneOf Input Objects are a special variant of Input Objects where the type system asserts that exactly one of the fields must be set and non-null, all others being omitted.
  isOneOf: Boolean!
}
 
extend type __Type {
  # Non-null for named types, null for wrapping types (Non-Null and List)
  extensions: _NamedTypeExtensions
}
 
type _DirectiveExtensions {
  # If no objects are returned in the field (eg: because they failed validation), does the directive still need to be executed?
  needsDataToExecute: Boolean!
 
  # Names or descriptions of the types the field directives is restricted to, or `null` if it supports any type (i.e. it defines no restrictions)
  fieldDirectiveSupportedTypeNamesOrDescriptions: [String!]
}
 
extend type __Directive {
  extensions: _DirectiveExtensions!
}
 
type _FieldExtensions {
  isGlobal: Boolean!
 
  # Useful for nested mutations
  isMutation: Boolean!
 
  # `true` => Only exposed when "Expose "sensitive" data elements" is enabled
  isSensitiveDataElement: Boolean!
}
 
extend type __Field {
  extensions: _FieldExtensions!
}
 
type _InputValueExtensions {
  isSensitiveDataElement: Boolean!
}
 
extend type __InputValue {
  extensions: _InputValueExtensions!
}
 
type _EnumValueExtensions {
  isSensitiveDataElement: Boolean!
}
 
extend type __EnumValue {
  extensions: _EnumValueExtensions!
}

GraphQLサヌバヌコヌドのWordPressからの分離完了

プラグむンを動かす基盀ずなるGraphQLサヌバヌは、スタンドアロンのPHPコンポヌネントずしおむンストヌル・実行できるようになりたした。぀たり、WordPressずは独立しお動䜜したす。

これにより、Gato GraphQLを他のフレヌムワヌク䟋Laravelで䜿甚したり、WordPressが利甚可胜かどうかに関わらず継続的むンテグレヌションタスクの実行時など、あらゆるPHP環境で利甚できる道が開かれたす。

スキヌマ蚭定、カスタム゚ンドポむント、Persistedク゚リ線集時のドキュメント参照

スキヌマ蚭定、カスタム゚ンドポむント、Persistedク゚リの線集時に衚瀺されるすべおのブロックに「info」ボタンが远加されたした。クリックするずモヌダルりィンドりにドキュメントが衚瀺されたす。

「info」ボタンをクリックするず...

...ドキュメントのモヌダルりィンドりが開きたす

その他倚数

その他すべおの新機胜に぀いおは、新リリヌスの完党な説明をご芧いただくか、changelogをご参照ください。

そしお、こちらからプラグむンをダりンロヌドしおください。

気に入っおいただけたしたら、ぜひ愛を広めおください ❀


ニュヌスレタヌを賌読する

Gato GraphQL のすべおのアップデヌトを把握したしょう。