ディレクティブは、GraphQLの最高の、そして最も口に出さない機能の1つです。
GraphQLの組み込みスキーマおよび操作指示を使用して、すべてのGraphQL Specに準拠したAPIが実装する必要があるという操作を検討しましょう。ユーザーが対話しているものに応じて応答ペイロードを減らすコントロールがあるため、動的なフロントエンドで作業している場合は非常に便利です。
テーブルに表示されている列をカスタマイズするオプションがあるアプリケーションを想像してみましょう。 2つまたは3つの列を非表示にすると、それらのセルのデータを取得する必要はありません。ただし、GraphQLディレクティブを使用すると、これらのフィールドを含めるかスキップすることを選択できます。
GraphQL仕様は、どのディレクティブが何であるか、およびそれらを使用できる場所の場所を定義します。具体的には、ディレクティブは、消費者運用(クエリなど)や基礎となるスキーマ自体によって使用できます。または、簡単に言えば、指令はスキーマまたは操作に基づいています。スキーマが生成されるときにスキーマディレクティブが使用され、クエリが実行されたときに操作指示が実行されます。
要するに、指令は、メタデータ、ランタイムヒント、ランタイム解析(特定の形式で日付を返すなど)、および拡張説明(非推奨など)の目的に使用できます。
GraphQLは、仕様ワーキングドラフトで定義されている4つの主要な指令を誇り、そのうちの1つは作業ドラフトとして未発表です。
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 Directiveはスキーマにのみ表示され、ユーザーが上記のようにクエリの一部として提供するものではありません。代わりに、 @deprecatedディレクティブは、GraphQL APIスキーマを維持する開発者によって指定されます。
ユーザーとして、スキーマで非推奨されているフィールドを取得しようとすると、このようなコンテキストヘルプを提供する警告を受け取ります。
非推奨フィールドをマークするには、スキーマ定義言語(SDL)内の @deprecatedディレクティブを使用して、このような引数内の理由を渡す必要があります。
タイプユーザー{ ID:ID! タイトル:string @deprecated(理由:「代わりに名前を使用」) 名前:文字列! メール:文字列! 役割:役割 }
これを@Includeディレクティブと組み合わせた場合、クエリ変数に基づいて非推奨フィールドを条件付きで取得できます。
ユーザーのフラグメントユーザー{ title @include(if:$ flecrecatedfields) 名前 メール 役割 } クエリgetusers($ includeprecatedfields:boolean!= false){ ユーザー{ id ...ユーザー } }
@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 サイトの他の関連記事を参照してください。