首頁  >  文章  >  php框架  >  在ThinkPHP6中使用GraphQL

在ThinkPHP6中使用GraphQL

王林
王林原創
2023-06-20 23:25:301648瀏覽

隨著前後端分離的流行,傳統的 RESTful API 已經無法滿足現代網路的需求。問題在於每個資源的 API 都需要單獨設計,而且每次請求只會傳回一個固定的結構,這就導致了大量的冗餘請求和數據,程式變得非常笨重,不利於開發和維護。

GraphQL 的出現就解決了這個問題,它是一種新型的 API 查詢語言和運行時,能夠有效地減少網路資料傳輸量和請求次數。與 RESTful API 不同的是,GraphQL 透過定義類型和模式來處理數據,這使得客戶端可以精確地請求所需的數據和類型,從而提高了數據的效率和回應速度。

在 PHP 開發中,ThinkPHP6 是一個流行的 Web 框架,提供了一些強大的特性,如物件導向程式設計、路由、模板和資料庫操作等。在本篇文章中,我們將介紹如何在 ThinkPHP6 中使用 GraphQL。

安裝

在開始之前,我們需要確保安裝了 PHP 和 Composer,並且熟悉 ThinkPHP6 專案的基本架構。接下來,我們需要在專案中引入 GraphQL:

composer require overblog/graphql-bundle:^0.12.17

配置

在引入 GraphQL 後,我們需要在 ThinkPHP6 設定檔中加入一些必要的設定。打開config/app.php 文件,找到providers 數組,加入GraphQL ServiceProvider:

'providers' => [
    // ...
    OverblogGraphQLBundleGraphQLBundleServiceProvider::class,
]

接下來,我們需要定義GraphQL 的路由,它將指向我們的GraphQL 查詢控制器。這裡我們可以使用一個獨立的路由檔案route/graphql.php,它回傳一個路由清單:

<?php

use thinkacadeRoute;

Route::any('/graphql', 'graphql/index')->name('graphql');

其中,graphql/index 指向我們的GraphQL 查詢控制器。

控制器

現在我們需要建立 GraphQL 控制器,它將負責處理所有 GraphQL 查詢和突變。我們建立一個appcontrollerGraphql.php 文件,定義一個空類別Graphql,並繼承OverblogGraphQLBundleControllerController

<?php

namespace appcontroller;

use OverblogGraphQLBundleControllerController;

class Graphql extends Controller
{
    //
}

在這個類別中,我們需要定義一些方法來處理GraphQL 查詢和突變。在 PHP 中,我們可以使用註解來定義這些方法的操作。因此,我們需要添加註解支援。這裡使用 doctrine/annotations 函式庫,使用 Composer 安裝:

composer require doctrine/annotations:^1.13.1

現在我們需要在 ThinkPHP6 中設定註解。開啟config/app.php 文件,編輯providers 數組,新增DoctrineCommonAnnotationsAnnotationReader 類別:

'providers' => [
    // ...
    DoctrineCommonAnnotationsAnnotationReader::class,
]

在控制器中,我們可以定義一個@Route 註解來指定GraphQL 查詢的路由位址,以及一個@ParamConverter 註解來自動轉換查詢參數等資訊。例如,我們定義一個簡單的查詢方法:

use OverblogGraphQLBundleAnnotation as GQL;

/**
 * @GQLType(type="MySchema")
 * @GQLQueryList()
 */
public function index()
{
    return [];
}

其中,@Type 註解指定了傳回值類型,@QueryList 註解指定這個方法是一個查詢方法。這裡返回空數組,方便測試。接下來,我們需要定義圖形查詢模式。

模式

在模式中,我們定義了 GraphQL 的圖形方案。我們使用 GraphQL 類別來建立它,並使用 @Object, @Route@Field 註解定義類型、方法和欄位。例如,我們假設我們要查詢一個使用者列表,定義一個UserQuery 類別:

use GraphQLTypeDefinitionObjectType;
use OverblogGraphQLBundleAnnotation as GQL;

/**
 * @GQLType(type="query")
 */
class UserQuery extends ObjectType
{
    /**
     * @GQLField(type="[User]", name="users")
     */
    protected function getUsers()
    {
        return // return data from database or service;
    }
}

這裡我們使用GraphQLTypeDefinitionObjectType 類別作為UserQuery 的基類,它定義了查詢的欄位和傳回類型。我們新增了一個 getUsers 方法,它將傳回一個使用者清單。我們也加入了一個 @Field 註解,它指定了這個欄位的類型和名稱。在這個例子中,我們回傳的是一個清單的使用者類型。

這裡,我們使用 type="[User]" 指定了使用者類型,它與定義使用者類型的方式有關。我們也可以寫一個 User 類型,具體定義方式可以參考 GitHub 上的 overblog/graphql-bundle 文件。

查詢

現在我們已經定義了控制器和模式,我們可以透過瀏覽器存取我們的GraphQL Endpoint,我們的請求位址是http://project.com/ graphql?query={users{id,name}}。這裡我們使用 POST 請求,傳遞查詢參數:

{
  "query": "{users{id,name}}"
}

這個請求將傳回一個 JSON 格式的數據,其中包含了 ID 和名稱等資訊。它的格式類似於這樣:

{
    "data": {
        "users": [
            {
                "id": 1,
                "name": "Alice"
            },
            {
                "id": 2,
                "name": "Bob"
            }
        ]
    }
}

我們也可以使用變數來傳遞參數。例如,我們想要查詢使用者 ID 為 1 的詳細資訊:

{
  "query": "query GetUser($id:Int){user(id:$id){id,name,email}}",
  "variables": {"id":1}
}

這將傳回使用者 ID、名稱和電子郵件地址等詳細資訊。這裡我們使用了一個 $ 符號來傳遞參數,它指定了我們要查詢使用者的 ID。我們使用 variables 關鍵字來定義實際變量,從而提供更精確的查詢參數。

總結

在本篇文章中,我們介紹如何在 ThinkPHP6 框架中使用 GraphQL。首先,我們提出了 GraphQL 的背景和優點,然後安裝了必要的軟體包並配置了路由。接下來,我們定義了一個簡單的查詢範例,並使用註解定義其類型和操作。最後,我們介紹了 GraphQL 的變數和查詢方法,示範如何使用 GraphQL 來查詢和處理資料。在實際開發中,我們可以根據需要自訂GraphQL 類型和操作,以實現更複雜的行為和查詢功能。

以上是在ThinkPHP6中使用GraphQL的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn