ホームページ > ウェブフロントエンド > CSSチュートリアル > 組み込みのGraphQLディレクティブを使用します

組み込みのGraphQLディレクティブを使用します

William Shakespeare
リリース: 2025-03-19 10:35:11
オリジナル
788 人が閲覧しました

組み込みのGraphQLディレクティブを使用します

ディレクティブは、GraphQLの最高の、そして最も口に出さない機能の1つです。

GraphQLの組み込みスキーマおよび操作指示を使用して、すべてのGraphQL Specに準拠したAPIが実装する必要があるという操作を検討しましょう。ユーザーが対話しているものに応じて応答ペイロードを減らすコントロールがあるため、動的なフロントエンドで作業している場合は非常に便利です。

ディレクティブの概要

テーブルに表示されている列をカスタマイズするオプションがあるアプリケーションを想像してみましょう。 2つまたは3つの列を非表示にすると、それらのセルのデータを取得する必要はありません。ただし、GraphQLディレクティブを使用すると、これらのフィールドを含めるかスキップすることを選択できます。

GraphQL仕様は、どのディレクティブが何であるか、およびそれらを使用できる場所の場所を定義します。具体的には、ディレクティブは、消費者運用(クエリなど)や基礎となるスキーマ自体によって使用できます。または、簡単に言えば、指令はスキーマまたは操作に基づいています。スキーマが生成されるときにスキーマディレクティブが使用され、クエリが実行されたときに操作指示が実行されます。

要するに、指令は、メタデータ、ランタイムヒント、ランタイム解析(特定の形式で日付を返すなど)、および拡張説明(非推奨など)の目的に使用できます。

4種類の指令

GraphQLは、仕様ワーキングドラフトで定義されている4つの主要な指令を誇り、そのうちの1つは作業ドラフトとして未発表です。

  • @含む
  • @スキップ
  • @Deprecated
  • @SpecifiedBy(ワーキングドラフト)

GraphQLを密接にフォローしている場合、2つの追加のディレクティブが、今日試すことができるJavaScriptの実装に合併されたことに気付くでしょう。@Streamと@Defer。これらは、コミュニティが実際のアプリケーションでそれらをテストしている間、まだ公式の仕様の一部ではありません。

@含む

@includeディレクティブは、その名前に忠実であり、IF引数を渡すことにより、フィールドを条件付けすることができます。条件付きであるため、クエリで変数を使用して真実を確認することは理にかなっています。

たとえば、次の例の変数が真実である場合、名前フィールドはクエリ応答に含まれます。

クエリgetusers($ showname:boolean){
  ユーザー{
    id
    名前@include(if:$ showname)
  }
}
ログイン後にコピー

逆に、クエリとともにfalseとして表示されている変数$ $を渡すことにより、フィールドを含めないことを選択できます。 $ showname変数のデフォルト値を指定することもできます。そのため、すべてのリクエストで渡す必要はありません。

クエリgetusers($ showname:boolean = true){
  ユーザー{
    id
    名前@include(if:$ showname)
  }
}
ログイン後にコピー

@スキップ

同じ種類のことをしただけで表現できますが、代わりに@SKIPディレクティブを使用します。値が真実である場合、ご想像のとおり、そのフィールドをスキップします。

クエリgetusers($ hidename:boolean){
  ユーザー{
    id
    名前@skip(if:$ hidename)
  }
}
ログイン後にコピー

これは個々のフィールドに最適ですが、複数のフィールドを含めたりスキップしたい場合もあります。このような複数の行で@includeと@skipの使用を複製することができます。

クエリgetusers($ includefields:boolean){
  ユーザー{
    id
    名前@include(if:$ includefields)
    電子メール@include(if:$ includefields)
    役割@include(if:$ includefields)
  }
}
ログイン後にコピー

@skipと@includeの両方のディレクティブは、フィールド、フラグメントスプレッド、およびインラインフラグメントで使用できます。

クエリgetusers($ excludefields:boolean){
  ユーザー{
    id
    ... user @skip(if:$ excludefields){
      名前
      メール
      役割
    }
  }
}
ログイン後にコピー

フラグメントが既に定義されている場合、クエリにフラグメントを広げるときに@Skipと@includeを使用することもできます。

ユーザーのフラグメントユーザー{
  名前
  メール
  役割
}

クエリgetusers($ excludefields:boolean){
  ユーザー{
    id
    ... user @skip(if:$ excludefields)
  }
}
ログイン後にコピー

@Deprecated

@Deprecated Directiveはスキーマにのみ表示され、ユーザーが上記のようにクエリの一部として提供するものではありません。代わりに、 @deprecatedディレクティブは、GraphQL APIスキーマを維持する開発者によって指定されます。

ユーザーとして、スキーマで非推奨されているフィールドを取得しようとすると、このようなコンテキストヘルプを提供する警告を受け取ります。

非推奨フィールドをマークするには、スキーマ定義言語(SDL)内の @deprecatedディレクティブを使用して、このような引数内の理由を渡す必要があります。

タイプユーザー{
  ID:ID!
  タイトル:string @deprecated(理由:「代わりに名前を使用」)
  名前:文字列!
  メール:文字列!
  役割:役割
}
ログイン後にコピー

これを@Includeディレクティブと組み合わせた場合、クエリ変数に基づいて非推奨フィールドを条件付きで取得できます。

ユーザーのフラグメントユーザー{
  title @include(if:$ flecrecatedfields)
  名前
  メール
  役割
}

クエリgetusers($ includeprecatedfields:boolean!= false){
  ユーザー{
    id
    ...ユーザー
  }
}
ログイン後にコピー

@SpecifiedBy

@SpecifiedByは指令の4番目であり、現在ワーキングドラフトの一部です。カスタムスカラーの実装で使用され、スカラーの仕様を指すURL引数を取得するように設定されています。

たとえば、電子メールアドレスにカスタムスカラーを追加する場合、その一部として使用する正規表現の仕様にURLを渡す必要があります。 RFC#822で定義された最後の例と提案を使用して、電子メールアドレスのスカラーは、次のようなスキーマで定義されます。

 Scalar EmailAddress @SpecifiedBy(url: "https://www.w3.org/protocols/rfc822/")
ログイン後にコピー

カスタムディレクティブには、他の追加されたディレクティブとの衝突を防ぐために、接頭辞付き名を持つことが推奨されます。カスタムディレクティブの例とその作成方法を探している場合は、GraphQLパブリックスキーマをご覧ください。これは、公共の場で消費できるAPIを注釈するためのコードとスキーマファーストの両方のサポートを備えたカスタムGraphQLディレクティブです。

まとめます

これは、GraphQLディレクティブの高レベルの外観です。繰り返しますが、ディレクティブは他のGraphQL機能に隠れてしまうようなものではないようなものだと思います。すでにGraphQLスキーマを使用して多くの制御があり、ディレクティブにより、クエリから必要なものを正確に取得するために、さらに細粒の制御が得られます。それは一種の効率性であり、GraphQL APIを非常に迅速かつ最終的にはより親しみやすくします。

また、GraphQL APIを構築している場合は、これらのディレクティブを内省クエリに含めるようにしてください。そこにそれらを持つことは、開発者に追加のコントロールの利点を与えるだけでなく、全体的に優れた開発者エクスペリエンスを提供します。フィールドを適切にリスクレックすることがどれほど役立つかを考えて、開発者はコードを離れる必要なく何をすべきかを知っていますか?それはそれ自体が強力です。

ヘッダーグラフィックは、イザベルゴンサルブの厚意によるものです

以上が組み込みのGraphQLディレクティブを使用しますの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート