>PHP 프레임워크 >ThinkPHP >ThinkPHP6에서 GraphQL 사용하기

ThinkPHP6에서 GraphQL 사용하기

王林
王林원래의
2023-06-20 23:25:301708검색

프런트엔드와 백엔드 분리의 인기로 인해 기존 RESTful API는 더 이상 현대 인터넷의 요구 사항을 충족할 수 없습니다. 문제는 각 리소스의 API를 별도로 설계해야 하고 각 요청이 고정된 구조만 반환하므로 수많은 중복 요청과 데이터가 발생하고 프로그램이 매우 번거로워 개발에 도움이 되지 않는다는 것입니다. 그리고 유지 보수.

GraphQL의 등장은 이러한 문제를 해결합니다. 네트워크 데이터 전송량과 요청 수를 효과적으로 줄일 수 있는 새로운 유형의 API 쿼리 언어 및 런타임입니다. RESTful API와 달리 GraphQL은 유형과 스키마를 정의하여 데이터를 처리하므로 클라이언트가 필요한 데이터와 유형을 정확하게 요청할 수 있으므로 데이터 효율성과 응답 속도가 향상됩니다.

PHP 개발에서 ThinkPHP6은 객체 지향 프로그래밍, 라우팅, 템플릿 및 데이터베이스 작업과 같은 몇 가지 강력한 기능을 제공하는 인기 있는 웹 프레임워크입니다. 이번 글에서는 ThinkPHP6에서 GraphQL을 사용하는 방법을 소개하겠습니다.

Installation

시작하기 전에 PHP와 Composer가 설치되어 있는지 확인하고 ThinkPHP6 프로젝트의 기본 구조에 익숙해야 합니다. 다음으로 프로젝트에 GraphQL을 도입해야 합니다.

composer require overblog/graphql-bundle:^0.12.17

Configuration

GraphQL을 도입한 후 ThinkPHP6 구성 파일에 몇 가지 필요한 설정을 추가해야 합니다. config/app.php 파일을 열고 providers 배열을 찾은 다음 GraphQL ServiceProvider를 추가합니다. 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。我们使用 variablesrrreee

다음으로, 다음을 가리키는 GraphQL 경로를 정의해야 합니다. GraphQL 쿼리 컨트롤러에. 여기서는 경로 목록을 반환하는 별도의 라우팅 파일 route/graphql.php를 사용할 수 있습니다. 🎜rrreee🎜 그중 graphql/index는 GraphQL 쿼리 컨트롤러를 가리킵니다. . 🎜🎜Controller🎜🎜이제 모든 GraphQL 쿼리와 변형을 처리하는 GraphQL 컨트롤러를 생성해야 합니다. appcontrollerGraphql.php 파일을 생성하고, 빈 클래스 Graphql을 정의하고, OverblogGraphQLBundleControllerController에서 상속합니다. 🎜rrreee🎜이 클래스에서는 다음을 수행해야 합니다. GraphQL 쿼리 및 변형을 처리하는 몇 가지 방법을 정의합니다. PHP에서는 주석을 사용하여 이러한 메서드의 작업을 정의할 수 있습니다. 따라서 주석 지원을 추가해야 합니다. 여기서는 doctrine/annotations 라이브러리가 사용되며 Composer를 사용하여 설치됩니다. 🎜rrreee🎜이제 ThinkPHP6에서 주석을 구성해야 합니다. config/app.php 파일을 열고 providers 배열을 편집한 다음 DoctrineCommonAnnotationsAnnotationReader 클래스를 추가합니다. 🎜rrreee🎜컨트롤러에서 다음을 수행할 수 있습니다. GraphQL 쿼리의 라우팅 주소를 지정하려면 @Route 주석을 정의하고, 쿼리 매개변수 및 기타 정보를 자동으로 변환하려면 @ParamConverter 주석을 정의하세요. 예를 들어 다음과 같은 간단한 쿼리 메서드를 정의합니다. 🎜rrreee🎜 그 중 @Type 주석은 반환 값 유형을 지정하고 @QueryList 주석은 이 메서드가 쿼리 방법. 테스트를 용이하게 하기 위해 여기에는 빈 배열이 반환됩니다. 다음으로 그래프 쿼리 패턴을 정의해야 합니다. 🎜🎜Patterns🎜🎜패턴에서는 GraphQL의 그래프 구성표를 정의합니다. GraphQL 클래스를 사용하여 생성하고 @Object, @Route@Field 주석을 사용하여 유형과 메서드를 정의합니다. 그리고 들판. 예를 들어, 사용자 목록을 쿼리하고 UserQuery 클래스를 정의한다고 가정합니다. 🎜rrreee🎜여기에서는 GraphQLTypeDefinitionObjectType 클래스를 UserQuery의 기본 클래스로 사용합니다. 쿼리 및 반환 유형의 필드를 정의합니다. 사용자 목록을 반환하는 getUsers 메소드를 추가했습니다. 또한 이 필드의 유형과 이름을 지정하는 @Field 주석도 추가했습니다. 이 예에서는 사용자 유형 목록을 반환합니다. 🎜🎜여기서 type="[User]"를 사용하여 사용자 유형을 지정하는데, 이는 사용자 유형이 정의되는 방식과 관련됩니다. User 유형을 작성할 수도 있습니다. 구체적인 정의 방법은 GitHub의 overblog/graphql-bundle 문서를 참조하세요. 🎜🎜Query🎜🎜이제 컨트롤러와 스키마가 정의되었으므로 브라우저를 통해 GraphQL 엔드포인트에 액세스할 수 있습니다. 요청 주소는 http://project.com/graphql?query={users{id ,name입니다. }}. 여기서는 POST 요청을 사용하여 쿼리 매개변수를 전달합니다. 🎜rrreee🎜이 요청은 ID 및 이름과 같은 정보가 포함된 JSON 형식의 데이터를 반환합니다. 형식은 다음과 유사합니다. 🎜rrreee🎜 변수를 사용하여 매개변수를 전달할 수도 있습니다. 예를 들어 사용자 ID 1의 세부 정보를 쿼리하려고 합니다. 🎜rrreee🎜 이렇게 하면 사용자 ID, 이름, 이메일 주소와 같은 세부 정보가 반환됩니다. 여기서는 $ 기호를 사용하여 쿼리하려는 사용자의 ID를 지정하는 매개변수를 전달합니다. 보다 정확한 쿼리 매개변수를 제공하기 위해 variables 키워드를 사용하여 실제 변수를 정의합니다. 🎜

요약

이 글에서는 ThinkPHP6 프레임워크에서 GraphQL을 사용하는 방법을 소개했습니다. 먼저 GraphQL의 배경과 장점을 설명한 뒤 필요한 패키지를 설치하고 라우팅을 구성했습니다. 다음으로 간단한 쿼리 예제를 정의하고 주석을 사용하여 쿼리 유형과 작업을 정의합니다. 마지막으로 GraphQL의 변수와 쿼리 메서드를 소개하여 GraphQL을 사용하여 데이터를 쿼리하고 처리하는 방법을 보여주었습니다. 실제 개발에서는 필요에 따라 GraphQL 유형과 작업을 사용자 정의하여 보다 복잡한 동작과 쿼리 기능을 달성할 수 있습니다.

위 내용은 ThinkPHP6에서 GraphQL 사용하기의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.