Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Laksanakan pertanyaan dan manipulasi data API yang cekap menggunakan PHP dan GraphQL

Laksanakan pertanyaan dan manipulasi data API yang cekap menggunakan PHP dan GraphQL

WBOY
WBOYasal
2023-06-25 11:23:271145semak imbas

Dengan perkembangan berterusan teknologi Internet, API telah menjadi cara penting untuk pelbagai perisian untuk berkomunikasi antara satu sama lain. API boleh menyediakan antara muka data bersatu supaya perisian yang berbeza boleh mengakses dan menggunakan antara satu sama lain. Walau bagaimanapun, apabila bilangan dan skala API terus meningkat, cara mengendalikan pertanyaan dan pengendalian data API dengan cepat dan cekap telah menjadi isu penting.

Dalam masalah ini, PHP dan GraphQL boleh memberikan penyelesaian yang sangat berkesan. Artikel ini akan memberikan beberapa pengenalan ringkas dan analisis penyelesaian ini.

Gambaran Keseluruhan PHP

PHP ialah bahasa skrip sumber terbuka tujuan umum, terutamanya sesuai untuk pembangunan web dan boleh dibenamkan dalam HTML. Tidak seperti bahasa pengaturcaraan lain, sintaks PHP agak mudah untuk dimulakan, jadi ia telah menjadi bahasa pilihan bagi ramai pemula. Pada masa yang sama, PHP juga mempunyai keupayaan pengaturcaraan yang kuat dan boleh mengendalikan pelbagai tugas yang kompleks dengan mudah.

Kebaikan dan Kelemahan PHP

Kebaikan PHP termasuk:

  • Mudah dimulakan: Sintaks PHP agak mudah dan ramai pemula boleh bermula dengan cepat.
  • Penggunaan merentas platform: PHP boleh dijalankan pada kebanyakan sistem pengendalian, termasuk Windows, Linux, MacOS, dll.
  • Sokong sumber terbuka: PHP ialah projek sumber terbuka sepenuhnya dengan komuniti yang besar dan pembangun aktif.
  • Skala yang baik: PHP boleh menggunakan pelbagai sambungan untuk meningkatkan fungsinya, seperti sambungan MySQL, sambungan SOAP, dsb.
  • Boleh dibenamkan dalam HTML: PHP boleh dibenamkan dalam HTML untuk memudahkan pembangunan web.

Kelemahan PHP termasuk:

  • Kebolehbacaan kod yang lemah: Kod PHP biasanya padat dan tidak boleh dibaca seperti bahasa lain.
  • Prestasi terhad: Terhad oleh sifat tafsiran dinamiknya, prestasi PHP agak rendah.
  • Keselamatan rendah: PHP mempunyai beberapa risiko keselamatan, seperti suntikan SQL, serangan XSS, dsb.

Ikhtisar GraphQL

GraphQL ialah bahasa pertanyaan data dan persekitaran masa jalan yang boleh digunakan untuk membuat pertanyaan dan mengendalikan API. Ia pada asalnya dibangunkan oleh Facebook dan dikeluarkan secara terbuka pada tahun 2015. Idea teras GraphQL adalah untuk membolehkan pelanggan menentukan data yang mereka perlukan, dengan itu mengurangkan trafik rangkaian dan beban pelayan yang tidak diperlukan.

Kelebihan dan Kelemahan GraphQL

Kelebihan GraphQL termasuk:

  • Fleksibiliti yang kuat: GraphQL membolehkan pelanggan menyesuaikan pertanyaan dan kaedah pengembalian data, yang lebih fleksibel daripada API REST tradisional.
  • Nestable: GraphQL boleh menyusun data mengikut keperluan dan melaksanakan berbilang pertanyaan mengikut keperluan, meningkatkan kecekapan pertanyaan.
  • Templat: Skema GraphQL mentakrifkan templat untuk data dan jenis data yang tersedia, meningkatkan kecekapan pembangunan.
  • Kawalan pelanggan: GraphQL membenarkan pelanggan mengawal data yang dikembalikan oleh API, mengelakkan penghantaran data yang tidak perlu dan masalah lain dalam API tradisional.

Kelemahan GraphQL termasuk:

  • Kos pembelajaran yang tinggi: Berbanding dengan REST API, GraphQL mempunyai kos pembelajaran yang lebih tinggi dan memerlukan lebih banyak masa untuk mempelajari bahasa dan konsepnya.
  • Sekatan akses merentas domain: Atas sebab keselamatan, API JavaScript penyemak imbas tidak boleh mengakses domain silang API GraphQL.
  • Kebolehan nyahpepijat yang lemah: Oleh kerana pertanyaan dan kaedah pemulangan GraphQL adalah fleksibel, sukar untuk nyahpepijat.

Bagaimana untuk menggunakan PHP dan GraphQL untuk mencapai pertanyaan dan operasi data API yang cekap?

PHP dan GraphQL boleh digunakan bersama-sama antara satu sama lain untuk menambah baik pertanyaan API dan kecekapan operasi. Berikut ialah salah satu kaedah pelaksanaan:

Langkah 1: Cipta Skema GraphQL

Skema GraphQL ialah templat yang mentakrifkan jenis data dan operasi, dan digunakan untuk menentukan jenis data dan operasi boleh laku yang disokong oleh API. Selepas menggunakan GraphQL's Schema, kita boleh menggunakan bahasa pertanyaan yang berfungsi pada model tersebut.

Kita boleh mencipta Skema berikut:

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
}

Langkah 2: Laksanakan pelaksana GraphQL

Pelaksana GraphQL boleh melakukan operasi seperti pertanyaan, mutasi dan langganan. Kita boleh menggunakan PHP untuk melaksanakan pelaksana GraphQL Berikut ialah contoh mudah.

<?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()
        ]
    ]);
}
?>

Dalam skrip PHP ini, kami mencipta Skema GraphQL dan menentukan tiga permintaan: getBook, getAllBooks dan addBook, updateBook, deleteBook (ditakrifkan dalam Mutasi). Permintaan ini akan memberikan pertanyaan, serta tiga operasi mutasi - tambah, kemas kini dan padam. Kita boleh menyimpannya dalam pangkalan data MySQL. Pada masa jalan, permintaan diproses dengan melaksanakan pernyataan pertanyaan.

Langkah 3: Bangunkan klien GraphQL

Pada peringkat ini, pelanggan boleh menggunakan skrip PHP untuk menjana pernyataan pertanyaan (atau mutasi) secara automatik. Ini bermakna pelanggan tidak perlu menulis kod dengan tangan dan boleh membina pertanyaan GraphQL dengan cepat tanpa menggunakan borang web atau UI. Kami boleh menggunakan perpustakaan PHP berikut untuk melaksanakan:

composer require  webonyx/graphql-php

Berikut ialah contoh klien PHP GraphQL yang mudah:

<?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);
?>

Dalam skrip klien ini, kami mentakrifkan lima permintaan: getAllBooks, getBook, addBook, updateBook dan deleteBook. Permintaan ini meliputi operasi yang paling biasa dilakukan dalam API GraphQL.

Fikiran Akhir

Gabungan PHP dan GraphQL menyediakan penyelesaian untuk mengendalikan pertanyaan dan operasi API dengan cekap. Sebagai bahasa pengaturcaraan Web, PHP sesuai untuk memproses logik perniagaan sebelah pelayan manakala GraphQL boleh mengurangkan jumlah penghantaran data dan meningkatkan kecekapan pertanyaan melalui kawalan klien dan seni bina templat. Melalui tiga langkah di atas, kita boleh lebih memahami senario aplikasi PHP dan GraphQL dalam pembangunan API, dan juga boleh menjadikan API yang lebih pintar dan cekap.

Atas ialah kandungan terperinci Laksanakan pertanyaan dan manipulasi data API yang cekap menggunakan PHP dan GraphQL. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn