ホームページ >バックエンド開発 >PHPチュートリアル >PHP と GraphQL を使用して効率的な API データ クエリと操作を実装する

PHP と GraphQL を使用して効率的な API データ クエリと操作を実装する

WBOY
WBOYオリジナル
2023-06-25 11:23:271168ブラウズ

インターネット技術の継続的な発展に伴い、API はさまざまなソフトウェアが相互に通信するための重要な方法になりました。 API は、さまざまなソフトウェアが相互にアクセスして使用できるように、統一されたデータ インターフェイスを提供できます。しかし、APIの数と規模が増加し続けるにつれ、APIデータのクエリと操作をいかに迅速かつ効率的に処理するかが重要な課題となっています。

この問題では、PHP と GraphQL が非常に効果的な解決策を提供します。この記事では、このソリューションの簡単な紹介と分析を説明します。

PHP の概要

PHP は汎用のオープンソース スクリプト言語で、特に Web 開発に適しており、HTML に埋め込むことができます。他のプログラミング言語とは異なり、PHP の構文は比較的簡単に始めることができるため、多くの初心者にとって最適な言語となっています。同時に、PHP は強力なプログラミング機能も備えており、さまざまな複雑なタスクを簡単に処理できます。

PHP の利点と欠点

PHP の利点は次のとおりです:

  • 開始が簡単: PHP の構文は比較的単純で、多くの初心者がすぐに開始できます。 。
  • クロスプラットフォームでの使用: PHP は、Windows、Linux、MacOS など、ほとんどのオペレーティング システムで実行できます。
  • サポート オープン ソース: PHP は、大規模なコミュニティと活発な開発者がいる完全なオープン ソース プロジェクトです。
  • 優れたスケーラビリティ: PHP は、MySQL 拡張機能、SOAP 拡張機能など、さまざまな拡張機能を使用して機能を強化できます。
  • HTML に埋め込み可能: PHP を HTML に埋め込んで、Web 開発を容易にすることができます。

PHP の欠点は次のとおりです。

  • コードの可読性が低い: 通常、PHP コードは密度が高く、他の言語ほど可読性が高くありません。
  • パフォーマンスの制限: 動的解釈の性質により制限されているため、PHP のパフォーマンスは比較的低くなります。
  • 低セキュリティ: PHP には、SQL インジェクション、XSS 攻撃などのセキュリティ リスクがいくつかあります。

GraphQL の概要

GraphQL は、API のクエリと操作に使用できるデータ クエリ言語およびランタイム環境です。元々は Facebook によって開発され、2015 年に公開されました。 GraphQL の中心となるアイデアは、クライアントが必要なデータを指定できるようにすることで、不必要なネットワーク トラフィックとサーバーの負荷を軽減することです。

GraphQL の長所と短所

GraphQL の利点は次のとおりです:

  • 強い柔軟性: GraphQL を使用すると、クライアントはクエリとデータの返しメソッドをカスタマイズできます。従来の REST API はより柔軟です。
  • ネスト可能: GraphQL は必要に応じてデータをネストし、必要に応じて複数のクエリを実行できるため、クエリの効率が向上します。
  • テンプレート: GraphQL のスキーマは、利用可能なデータとデータ型のテンプレートを定義し、開発効率を向上させます。
  • クライアント制御: GraphQL を使用すると、クライアントは API から返されるデータを制御できるようになり、従来の API における不必要なデータ送信やその他の問題を回避できます。

GraphQL の欠点は次のとおりです:

  • 学習コストが高い: REST API と比較して、GraphQL は学習コストが高く、言語と概念を学習するのにより多くの時間を必要とします。
  • クロスドメイン アクセス制限: セキュリティ上の理由により、ブラウザの JavaScript API は GraphQL API クロスドメインにアクセスできません。
  • デバッグ性が低い: 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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。