ホームページ >バックエンド開発 >PHPチュートリアル >PHP と GraphQL を使用して効率的な API データ クエリと操作を実装する
インターネット技術の継続的な発展に伴い、API はさまざまなソフトウェアが相互に通信するための重要な方法になりました。 API は、さまざまなソフトウェアが相互にアクセスして使用できるように、統一されたデータ インターフェイスを提供できます。しかし、APIの数と規模が増加し続けるにつれ、APIデータのクエリと操作をいかに迅速かつ効率的に処理するかが重要な課題となっています。
この問題では、PHP と GraphQL が非常に効果的な解決策を提供します。この記事では、このソリューションの簡単な紹介と分析を説明します。
PHP の概要
PHP は汎用のオープンソース スクリプト言語で、特に Web 開発に適しており、HTML に埋め込むことができます。他のプログラミング言語とは異なり、PHP の構文は比較的簡単に始めることができるため、多くの初心者にとって最適な言語となっています。同時に、PHP は強力なプログラミング機能も備えており、さまざまな複雑なタスクを簡単に処理できます。
PHP の利点と欠点
PHP の利点は次のとおりです:
PHP の欠点は次のとおりです。
GraphQL の概要
GraphQL は、API のクエリと操作に使用できるデータ クエリ言語およびランタイム環境です。元々は Facebook によって開発され、2015 年に公開されました。 GraphQL の中心となるアイデアは、クライアントが必要なデータを指定できるようにすることで、不必要なネットワーク トラフィックとサーバーの負荷を軽減することです。
GraphQL の長所と短所
GraphQL の利点は次のとおりです:
GraphQL の欠点は次のとおりです:
PHP と GraphQL を使用して効率的な API データ クエリと操作を実現するにはどうすればよいですか?
PHP と GraphQL を相互に組み合わせて使用すると、API クエリと操作の効率を向上させることができます。以下は実装方法の 1 つです:
ステップ 1: GraphQL スキーマの作成
GraphQL スキーマはデータ型と操作を定義するテンプレートであり、サポートされるデータ型と実行可能ファイルを指定するために使用されます。 API操作による。 GraphQL のスキーマを使用すると、そのモデルで動作するクエリ言語を使用できるようになります。
次のスキーマを作成できます:
type Book { id: ID! title: String! author: String! publisher: String! price: Float! } type Query { getBook(id: ID!): Book getAllBooks: [Book] } type Mutation { addBook(title: String!, author: String!, publisher: String!, price: Float!): ID! updateBook(id: ID!, title: String, author: String, publisher: String, price: Float): Book deleteBook(id: ID!): Boolean }
ステップ 2: GraphQL エグゼキュータを実装する
GraphQL エグゼキュータは、クエリ、ミューテーション、サブスクリプションなどの操作を実行できます。 PHP を使用して GraphQL のエグゼキュータを実装できます。簡単な例を次に示します。
<?php require_once(__DIR__ . '/vendor/autoload.php'); use GraphQLTypeSchema; use GraphQLTypeDefinitionObjectType; use GraphQLTypeDefinitionType; use GraphQLGraphQL; use GraphQLTypeDefinitionResolveInfo; $db = mysqli_connect('localhost', 'root', '', 'books'); mysqli_query($db, "SET NAMES 'UTF8'"); $queryType = new ObjectType([ 'name' => 'Query', 'fields' => [ 'getBook' => [ 'type' => $bookType, 'args' => [ 'id' => Type::nonNull(Type::id()) ], 'resolve' => function ($root, $args) use ($db) { $result = mysqli_query($db, "SELECT * FROM books WHERE id = {$args['id']}"); $book = mysqli_fetch_assoc($result); return $book; } ], 'getAllBooks' => [ 'type' => Type::listOf($bookType), 'resolve' => function ($root, $args) use ($db) { $result = mysqli_query($db, "SELECT * FROM books"); $books = mysqli_fetch_all($result, MYSQLI_ASSOC); return $books; } ] ] ]); $mutationType = new ObjectType([ 'name' => 'Mutation', 'fields' => [ 'addBook' => [ 'type' => Type::id(), 'args' => [ 'title' => Type::nonNull(Type::string()), 'author' => Type::nonNull(Type::string()), 'publisher' => Type::nonNull(Type::string()), 'price' => Type::nonNull(Type::float()) ], 'resolve' => function ($root, $args) use ($db) { $result = mysqli_query($db, "INSERT INTO books (title, author, publisher, price) VALUES ('{$args['title']}', '{$args['author']}', '{$args['publisher']}', {$args['price']})"); $id = mysqli_insert_id($db); return $id; } ], 'updateBook' => [ 'type' => $bookType, 'args' => [ 'id' => Type::nonNull(Type::id()), 'title' => Type::string(), 'author' => Type::string(), 'publisher' => Type::string(), 'price' => Type::float() ], 'resolve' => function ($root, $args) use ($db) { $sql = "UPDATE books SET"; if (!is_null($args['title'])) $sql .= " title='{$args['title']}',"; if (!is_null($args['author'])) $sql .= " author='{$args['author']}',"; if (!is_null($args['publisher'])) $sql .= " publisher='{$args['publisher']}',"; if (!is_null($args['price'])) $sql .= " price={$args['price']},"; $sql = rtrim($sql, ','); $sql .= " WHERE id = {$args['id']}"; mysqli_query($db, $sql); $result = mysqli_query($db, "SELECT * FROM books WHERE id = {$args['id']}"); $book = mysqli_fetch_assoc($result); return $book; } ], 'deleteBook' => [ 'type' => Type::boolean(), 'args' => [ 'id' => Type::nonNull(Type::id()) ], 'resolve' => function ($root, $args) use ($db) { mysqli_query($db, "DELETE FROM books WHERE id = {$args['id']}"); return true; } ], ] ]); $bookType = new ObjectType([ 'name' => 'Book', 'fields' => [ 'id' => [ 'type' => Type::nonNull(Type::id()) ], 'title' => [ 'type' => Type::nonNull(Type::string()) ], 'author' => [ 'type' => Type::nonNull(Type::string()) ], 'publisher' => [ 'type' => Type::nonNull(Type::string()) ], 'price' => [ 'type' => Type::nonNull(Type::float()) ], ] ]); $schema = new Schema([ 'query' => $queryType, 'mutation' => $mutationType ]); $input = file_get_contents('php://input'); try { $result = GraphQL::executeQuery($schema, $input); echo json_encode($result->toArray()); } catch (Exception $e) { echo json_encode([ 'error' => [ 'message' => $e->getMessage() ] ]); } ?>
この PHP スクリプトでは、GraphQL スキーマを作成し、getBook、getAllBooks、および addBook、updateBook、deleteBook (Mutation で定義) の 3 つのリクエストを定義しました。これらのリクエストはクエリと 3 つの変更操作 (追加、更新、削除) を提供します。それらを MySQL データベースに保存できます。実行時、リクエストはクエリ ステートメントを実行することによって処理されます。
ステップ 3: GraphQL クライアントの開発
この段階では、クライアントは PHP スクリプトを使用してクエリ (またはミューテーション) ステートメントを自動的に生成できます。これは、クライアントがコードを手動で記述する必要がなく、Web フォームや UI を使用せずに GraphQL クエリを迅速に構築できることを意味します。次の PHP ライブラリを使用して実装できます:
composer require webonyx/graphql-php
以下は簡単な PHP GraphQL クライアントの例です:
<?php require_once(__DIR__ . '/vendor/autoload.php'); use GraphQLClient; use GraphQLQuery; use GraphQLVariable; $client = new Client('http://localhost/graphql.php', [ 'headers' => [ 'Content-Type' => 'application/json', 'Accept' => 'application/json', ], ]); // 查询所有书籍 $queryAllBooks = new Query('getAllBooks', [], [ 'id', 'title', 'author', 'publisher', 'price' ]); $response = $client->runQuery($queryAllBooks); var_dump($response); // 查询某本书 $queryBook = new Query('getBook', [ new Variable('id', 'ID!', '1') ], [ 'id', 'title', 'author', 'publisher', 'price' ]); $response = $client->runQuery($queryBook); var_dump($response); // 添加一本新书 $mutationAddBook = new Query('addBook', [ new Variable('title', 'String!', 'PHP Programming'), new Variable('author', 'String!', 'John Doe'), new Variable('publisher', 'String!', 'Publisher 123'), new Variable('price', 'Float!', 123.45) ], [ 'id' ]); $response = $client->runQuery($mutationAddBook); var_dump($response); // 更新一本书 $mutationUpdateBook = new Query('updateBook', [ new Variable('id', 'ID!', 1), new Variable('title', 'String', 'PHP Programming'), new Variable('author', 'String', 'John Doe'), new Variable('publisher', 'String', 'Publisher 321'), new Variable('price', 'Float', 123.45) ], [ 'id', 'title', 'author', 'publisher', 'price' ]); $response = $client->runQuery($mutationUpdateBook); var_dump($response); // 删除一本书 $mutationDeleteBook = new Query('deleteBook', [ new Variable('id', 'ID!', 1), ], [ 'id' ]); $response = $client->runQuery($mutationDeleteBook); var_dump($response); ?>
このクライアント スクリプトでは、 getAllBooks、getBook、addBook 、updateBook、deleteBook を定義します。 5つのリクエスト。これらのリクエストは、GraphQL API で実行される最も一般的な操作をカバーします。 ######最終的な考え###
PHP と GraphQL を組み合わせることで、API クエリと操作を効率的に処理するためのソリューションが提供されます。 Web プログラミング言語として、PHP はサーバー側のビジネス ロジックの処理に適していますが、GraphQL はクライアント制御とテンプレート化されたアーキテクチャを通じてデータ送信量を削減し、クエリ効率を向上させることができます。上記の 3 つのステップを通じて、API 開発における PHP と GraphQL のアプリケーション シナリオをより深く理解することができ、よりスマートで効率的な API を作成することもできます。
以上がPHP と GraphQL を使用して効率的な API データ クエリと操作を実装するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。