Home  >  Article  >  Backend Development  >  Detailed explanation of how to install and use GraphQL in PHP

Detailed explanation of how to install and use GraphQL in PHP

青灯夜游
青灯夜游forward
2021-05-07 18:38:124169browse

This article takes you through GraphQL and introduces in detail how to install and use GraphQL in PHP. It has certain reference value. Friends in need can refer to it. I hope it will be helpful to everyone.

Detailed explanation of how to install and use GraphQL in PHP

About GraphQL

GraphQL is a modern way to build HTTP API interfaces, and clients can on-demandQuery the required data.
GraphQL can improve the flexibility of API calls. We can request the API to obtain the required data just like writing database query statements. This is very useful for building complex API queries.

Comparison with REST

The core idea of ​​REST is resources. Each resource can be represented by a URL. You can access the URL through a GET request to obtain it. this resource. According to the definition of most APIs today, you are likely to get a data response in JSON format. The whole process is roughly like this:

GET /user/1
{
    "username":"姓名",
    "age":20,
    "sex":"男"
}
GET /book/1
{
    "book":"书名",
    "author":"作者",
    "country":"中国"
}

As can be seen from the above example, if the front end requires user /1 and book/1 need to call 2 times interface, and if the front end only needs username# in user/1 ##, and the above interface obtains data other than username, then for the front end, data other than username is nowhere available, resulting in a waste of resources.

If we use

GraphQL to query, compared with the REST method, we only need to call once and can query the fields we specify , avoiding the waste of resources and being more efficient.

query {
 user(id:1) {
     username
 }
 book(id:1){
     book,
     author,
     country
 }
}

Recommended learning: "

PHP Video Tutorial"

Install the graphql-php package
composer require webonyx/graphql-php

Start

1. After the installation is complete, we first write a simple example to see how to use graphql-php. The specific code is as follows: In this code, we define a file named

phoneNumber field, and then call the code we wrote through postman.

<?php
require_once __DIR__ . &#39;/vendor/autoload.php&#39;;
use GraphQL\Type\Schema;
use GraphQL\Type\Definition\ObjectType;
use GraphQL\Type\Definition\Type;
use GraphQL\GraphQL;

$queryType = new ObjectType([
    &#39;name&#39; => &#39;Query&#39;,
    &#39;fields&#39; => [
        &#39;phoneNumber&#39; => [
            &#39;type&#39; => Type::int(),
            &#39;resolve&#39; => function () {
                return 1875555555;
            }
        ]
    ],
]);

$schema = new Schema([
    &#39;query&#39; => $queryType,
]);



$rawInput = file_get_contents(&#39;php://input&#39;);
$input = json_decode($rawInput, true);

$query = $input[&#39;query&#39;];
$variableValues = isset($input[&#39;variables&#39;]) ? $input[&#39;variables&#39;] : null;

try {
    $rootValue = [&#39;prefix&#39; => &#39;prefix: &#39;];
    $result = GraphQL::executeQuery($schema, $query, $rootValue, null, $variableValues);
    $output = $result->toArray();
} catch (\Exception $e) {

    $output = [
        &#39;errors&#39; => [
            [
                &#39;message&#39; => $e->getMessage()
            ]
        ]
    ];
}
header(&#39;Content-Type: application/json&#39;);
echo json_encode($output);

2. Use postman to call the code we just wrote. The following is an example of our query results

Detailed explanation of how to install and use GraphQL in PHP

##Introduction

From the above example, we can see that the example mainly introduces 4 classes

use GraphQL\Type\Schema;
use GraphQL\Type\Definition\ObjectType;
use GraphQL\Type\Definition\Type;
use GraphQL\GraphQL;

Schema class

Schema is a container of type hierarchy. It accepts the root type in the constructor and provides methods for the internal GrahpQL tooling to receive your type information.

Configuration Options

An array containing the following options:

OptionqueryObjectTypeRequired. mutation ObjectTypesubscription# will be used when data is changed. Compatible with self-checking queries, used for various clients (such as Relay or GraphiQL)directives and ObjectType[]callable
Type Notes
Read the object type containing root-level fields in the API (usually named "Query"), used to read data
Write the object type containing root-level fields in the API (usually named "Mutation").
##ObjectType is reserved for future description implementations. Currently it is graphql-js
Directive[] includes built-in directives @skip@include by default. If you pass custom directives and still want to use the built-in directives, add them explicitly. For example:

array_merge(GraphQL::getStandardDirectives(), [$myCustomDirective]);

##types
Object type class table, which cannot be discovered by graphql-php during static schema parsing. In most cases, the object type is not directly referenced in the field, but it is still used when it is part of the schema, because it implements a call in resolveType to resolve to The interface for this object type.

Note that you don't need to pass all types here, it's just a workaround for your specific use case.

typeLoader
##function($name) Returns the given type instance name . In the case of multiple calls, the same instance must be returned. See the lazy type loading section below.

ObjectType类

GraphQL\Type\Definition\ObjectType

对象类型是典型的 GraphQL 应用程序中使用最频繁的基元。

配置选项

Option Type Notes
name string 必须。 Schema 中此对象的唯一名称
fields array or callable 必须。 描述对象字段或可调用返回此类数组的数组。
description string 呈现于客户端的参数文本说明(例如:用于 GraphiQL 自动生成文档 )
interfaces array or callable 此类型实现的接口列表或返回此类列表的可调用接口。

内置标量类型

<?php
use GraphQL\Type\Definition\Type;
// 内置标量类型
Type::string();  // String 类型
Type::int();     // Int 类型
Type::float();   // Float 类型
Type::boolean(); // Boolean 类型
Type::id();      // ID 类型

字段参数

GraphQL 对象类型上的所有字段都有 0 个或多个参数,使用在 args 的字段定义上。每个参数数组参考以下说明:

Option Type Notes
name string 必须。 参数名称。 为空时,使用 args 数组键值
type Type 必须。
description string 呈现于客户端的参数文本说明
defaultValue scalar 当前参数默认值

示例

$queryType = new ObjectType([
    &#39;name&#39; => &#39;Query&#39;,
    &#39;fields&#39; => [
        &#39;phoneNumber&#39; => [
            &#39;type&#39; => Type::int(),
            &#39;resolve&#39; => function () {
                return 1875555555;
            }
        ]
    ],
]);

GraphQL 类

GraphQL类主要在查询的时候用到,我们可以用 GraphQL::executeQuery 方法来执行查询

executeQuery 方法的参数说明

参数 类型 说明
schema GraphQL\Type\Schema 必须。  Schema应用实例
queryString string or GraphQL\Language\AST\DocumentNode 必须。 解析,验证并执行现有的 GraphQL 查询字符。 如果在执行之前解析其他查询,则在此处传递相应的 AST 文档节点来避免新的解析。
rootValue mixed 表示数据图结构的基础值。作为Query type 字段解析传递的第一个参数。如果现有该值已被 Query type 解析过,则可忽略或设置为 null 值。
context mixed 字段解析器的共享信息。 常用来传递已登录用户信息,位置详情等。

它将用在所有字段解析器的第 3 个参数。
variableValues array 变量的映射,该值将随同查询字符串一起传递。请查阅 GraphQL官网查询变量的相关
operationName string 指定请求方可执行的操作, 防止条件查询字符包含多级操作。
fieldResolver callable Schema 参数 schema 中未实现的解析器函数。
validationRules array 查询验证规则组,默认所有规则。空数组将跳过查询验证 (对于持久化查询将会比较方便,查询会在持久化之前默认已验证,并在执行期间假设符合规则)。
use GraphQL\GraphQL;

$result = GraphQL::executeQuery(
    $schema, 
    $queryString, 
    $rootValue = null, 
    $context = null, 
    $variableValues = null, 
    $operationName = null,
    $fieldResolver = null,
    $validationRules = null
);

简单示例

我们介绍完GraphQL几个概念之后,用几个简单的示例带大家来体验一下。

普通示例

在这个示例中我们定义了2个字段,分别是phoneNumberecho,其中phoneNumber为 Type::int()类型,echoType::string()类型,同时echo字段带有一个参数为message

<?php

require_once __DIR__ . &#39;/vendor/autoload.php&#39;;

use GraphQL\Type\Definition\ObjectType;
use GraphQL\Type\Definition\Type;
use GraphQL\GraphQL;
use GraphQL\Type\Schema;

$queryType = new ObjectType([
    &#39;name&#39; => &#39;Query&#39;,
    &#39;fields&#39; => [
        &#39;phoneNumber&#39; => [
            &#39;type&#39; => Type::int(),
            &#39;resolve&#39; => function () {
                return 1875555555;
            }
        ],

        &#39;echo&#39; => [
            &#39;type&#39; => Type::string(),
            &#39;args&#39; => [
                &#39;message&#39; => Type::string(),
            ],
            &#39;resolve&#39; => function ($root, $args) {
                return &#39;echo msg result:&#39; . ($args[&#39;message&#39;] ?? &#39;nothing&#39;);
            }
        ],
    ],
]);

$schema = new Schema([
    &#39;query&#39; => $queryType
]);


$rawInput = file_get_contents(&#39;php://input&#39;);
$input = json_decode($rawInput, true);

$query = $input[&#39;query&#39;];
$variableValues = isset($input[&#39;variables&#39;]) ? $input[&#39;variables&#39;] : null;

try {
    $rootValue = [&#39;prefix&#39; => &#39;prefix: &#39;];
    $result = GraphQL::executeQuery($schema, $query, $rootValue, null, $variableValues);
    $output = $result->toArray();
} catch (\Exception $e) {

    $output = [
        &#39;errors&#39; => [
            [
                &#39;message&#39; => $e->getMessage()
            ]
        ]
    ];
}
header(&#39;Content-Type: application/json&#39;);
echo json_encode($output);

执行示例代码结果

Detailed explanation of how to install and use GraphQL in PHP

我们可以看到,在请求时我们传了phoneNumberecho两个字段,并且messagetest

对象示例

我们在上面说过,对象类型是典型的 GraphQL 应用程序中使用最频繁的基元,一个对象类型里面可以包含宁外一个对象类型,我们可以新定义一个名为$userTypeObjectType,然后在oneUser指定它的类型为$userType,这样我们执行查询的时候,oneUser就会返回一个对象。

<?php
require_once __DIR__ . &#39;/vendor/autoload.php&#39;;

use GraphQL\Type\Definition\ObjectType;
use GraphQL\Type\Definition\Type;
use GraphQL\GraphQL;
use GraphQL\Type\Schema;

$userType = new ObjectType([
    &#39;name&#39; => &#39;userType&#39;,
    &#39;description&#39; => &#39;用户详情&#39;,
    &#39;fields&#39; => [
        &#39;uid&#39; => [
            &#39;type&#39; => Type::int(),
            &#39;description&#39; => &#39;用户ID&#39;
        ],
        &#39;name&#39; => Type::string()
    ]
]);


$queryType = new ObjectType([
    &#39;name&#39; => &#39;Query&#39;,
    &#39;fields&#39; => [
        &#39;oneUser&#39; => [
            &#39;type&#39; => $userType, // 我们这里指定type为我们上面创建的$userType
            &#39;description&#39; => &#39;用户列表&#39;,
            &#39;args&#39; => [
                &#39;uid&#39; => [
                    &#39;type&#39; => Type::int(),
                    &#39;defaultValue&#39; => 222
                ]
            ],
            &#39;resolve&#39; => function($root, $args) {
                return  [
                    "uid" => $args[&#39;user_id&#39;] ?? 3,
                    "name" => "xzl",
                ];
            }
        ],
    ]
]);

$schema = new Schema([
    &#39;query&#39; => $queryType
]);

$rawInput = file_get_contents(&#39;php://input&#39;);
$input = json_decode($rawInput, true);
$query = $input[&#39;query&#39;];
$variableValues = isset($input[&#39;variables&#39;]) ? $input[&#39;variables&#39;] : null;

try {
    $rootValue = [&#39;prefix&#39; => &#39;prefix: &#39;];
    $result = GraphQL::executeQuery($schema, $query, $rootValue, null, $variableValues);
    $output = $result->toArray();
} catch (\Exception $e) {
    $output = [
        &#39;errors&#39; => [
            [
                &#39;message&#39; => $e->getMessage()
            ]
        ]
    ];
}
header(&#39;Content-Type: application/json&#39;);
echo json_encode($output);

执行示例代码结果

Detailed explanation of how to install and use GraphQL in PHP

列表示例

在平时的开发请求中,我们从后端接口获取数据的时候,大部分都是以列表的形式返回的,我们可以通过Type::listOf方法来指定我们返回的字段是一个列表。

<?php
require_once __DIR__ . &#39;/vendor/autoload.php&#39;;

use GraphQL\Type\Definition\ObjectType;
use GraphQL\Type\Definition\Type;
use GraphQL\GraphQL;
use GraphQL\Type\Schema;

class User
{
    // 模拟从数据库取数据
    public static function getUserLimit($limit)
    {
        $user  = [
            [
                "uid" => 1,
                "name" => "name1"
            ],
            [
                "uid" => 2,
                "name" => "name2"
            ],
            [
                "uid" => 3,
                "name" => "name3"
            ],
            [
                "uid" => 4,
                "name" => "name4"
            ]
        ];
        return array_slice($user, 0, $limit);
    }
}


$userType = new ObjectType([
    &#39;name&#39; => &#39;userType&#39;,
    &#39;description&#39; => &#39;用户详情&#39;,
    &#39;fields&#39; => [
        &#39;uid&#39; => [
            &#39;type&#39; => Type::int(),
            &#39;description&#39; => &#39;用户ID&#39;
        ],
        &#39;name&#39; => Type::string()
    ]
]);


$queryType = new ObjectType([
    &#39;name&#39; => &#39;Query&#39;,
    &#39;fields&#39; => [
        &#39;users&#39; => [
            &#39;type&#39; => Type::listOf($userType),
            &#39;description&#39; => &#39;用户列表&#39;,
            &#39;args&#39; => [
                &#39;limit&#39; => [
                    &#39;type&#39; => Type::int(),
                    &#39;description&#39; => &#39;限制条数&#39;,
                    &#39;defaultValue&#39; => 10
                ]
            ],
            &#39;resolve&#39; => function($root, $args) {
                return User::getUserLimit($args[&#39;limit&#39;]);
            }
        ]
    ]
]);



$schema = new Schema([
    &#39;query&#39; => $queryType
]);


$rawInput = file_get_contents(&#39;php://input&#39;);
$input = json_decode($rawInput, true);
$query = $input[&#39;query&#39;];
$variableValues = isset($input[&#39;variables&#39;]) ? $input[&#39;variables&#39;] : null;

try {
    $rootValue = [&#39;prefix&#39; => &#39;prefix: &#39;];
    $result = GraphQL::executeQuery($schema, $query, $rootValue, null, $variableValues);
    $output = $result->toArray();
} catch (\Exception $e) {
    $output = [
        &#39;errors&#39; => [
            [
                &#39;message&#39; => $e->getMessage()
            ]
        ]
    ];
}
header(&#39;Content-Type: application/json&#39;);
echo json_encode($output);

执行示例代码结果

Detailed explanation of how to install and use GraphQL in PHP

从上面结果可以看到,我们传了limit参数为2,最终从我们模拟的数据里面取出了2条数据

使用类型语言

在上面的示例中,如果我们代码返回的数据比较复杂时,需要编写大量的代码,通过GraphQL类型语言,我们可以减少代码量,使代码看上去更加简洁,这是一个用 GraphQL 类型语言定义的简单 Schema示例。

<?php

require_once __DIR__ . &#39;/vendor/autoload.php&#39;;
use GraphQL\GraphQL;
use GraphQL\Utils\BuildSchema;
// graph.graphql  文件内容
$graph =
<<<GRAPH
schema {
  query: Query
}

type Query {
  graph_test: String
  echo(message: String): String
  show_test: Show
  show_test_arr: [Show]
}


type Show {
    content: String!
    text: String!
}
GRAPH;


$schema = BuildSchema::build($graph);
$rawInput = file_get_contents(&#39;php://input&#39;);
$input = json_decode($rawInput, true);
$query = $input[&#39;query&#39;];
$variableValues = isset($input[&#39;variables&#39;]) ? $input[&#39;variables&#39;] : null;

try {
    $rootValue = [
        &#39;sum&#39; => function($rootValue, $args, $context) {
            return $args[&#39;x&#39;] + $args[&#39;y&#39;];
        },
        &#39;echo&#39; => function($rootValue, $args, $context) {
            return $rootValue[&#39;prefix&#39;] . ($args[&#39;message&#39;] ?? &#39;no echo&#39;);
        },
        &#39;show_test&#39; => function($rootValue, $args, $context) {
            return [
                &#39;content&#39; => &#39;show_content&#39;,
                &#39;text&#39; => &#39;xxxx xxx&#39;
            ];
        },
        &#39;show_test_arr&#39; => function($rootValue, $args, $context) {
            return [
                [
                    &#39;content&#39; => &#39;show_content&#39;,
                    &#39;text&#39; => &#39;xxxx xxx&#39;
                ],
                [
                    &#39;content&#39; => &#39;show_content_2&#39;,
                    &#39;text&#39; => &#39;xxxx xxx_2&#39;
                ]

            ];
        },
        &#39;prefix&#39; => &#39;from test:&#39;,
        "graph_test" => "graphql_test"
    ];;
    $result = GraphQL::executeQuery($schema, $query, $rootValue, null, $variableValues);
    $output = $result->toArray();
} catch (\Exception $e) {

    \GraphQL\Server\StandardServer::send500Error($e);
}
header(&#39;Content-Type: application/json&#39;);
echo json_encode($output);

执行示例代码结果

Detailed explanation of how to install and use GraphQL in PHP

参考

graphql.cn/learn/

learnku.com/docs/graphq…

更多编程相关知识,请访问:编程视频!!

The above is the detailed content of Detailed explanation of how to install and use GraphQL in PHP. For more information, please follow other related articles on the PHP Chinese website!

Statement:
This article is reproduced at:juejin.cn. If there is any infringement, please contact admin@php.cn delete