这篇文章将为大家详细讲解有关PHP中怎么安装和使用GraphQL,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。
在西丰等地区,都构建了全面的区域性战略布局,加强发展的系统性、市场前瞻性、产品创新能力,以专注、极致的服务理念,为客户提供成都网站建设、成都做网站 网站设计制作按需设计,公司网站建设,企业网站建设,高端网站设计,全网营销推广,外贸网站制作,西丰网站建设费用合理。
php是什么语言
php,一个嵌套的缩写名称,是英文超级文本预处理语言(PHP:Hypertext Preprocessor)的缩写。PHP 是一种 HTML 内嵌式的语言,PHP与微软的ASP颇有几分相似,都是一种在服务器端执行的嵌入HTML文档的脚本语言,语言的风格有类似于C语言,现在被很多的网站编程人员广泛的运用。
关于 GraphQL
GraphQL 是一种现代化的 HTTP API 接口构建方式,客户端可以按需查询需要的数据。
GraphQL 可以提升 API 调用的灵活性,我们可以像写数据库查询语句一样来请求 API 来获取所需要的数据,这对构建复杂的 API 查询来说非常有用。
与REST对比
REST的核心思想就是资源,每个资源都能用一个URL来表示,你能通过一个GET请求访问该URL从而获取该资源。根据当今大多数API的定义,你很有可能会得到一份JSON格式的数据响应,整个过程大概是这样:
GET /user/1
{
"username":"姓名",
"age":20,
"sex":"男"
}GET /book/1
{
"book":"书名",
"author":"作者",
"country":"中国"
}从上面的示例可以看出,如果前端需要user/1和book/1的时候需要调用2次接口,并且如果前端只需要user/1里面的username,而上面的接口获取了username以外的数据,那么对于前端而言,除 username 之外的数据无处可用,造成了资源的浪费。
如果我们使用GraphQL来进行查询的话,与REST方式相比,只需要调用一次并且可以查询我们指定的字段,避免了资源的浪费,并且更加高效。
query {
user(id:1) {
username
}
book(id:1){
book,
author,
country
}
}推荐学习:《PHP视频教程》
安装graphql-php包
composer require webonyx/graphql-php
开始
1、安装完成之后,我们先编写一个简单示例,来看看graphql-php怎么用,具体代码如下:这段代码中,我们定义了一个名为phoneNumber的字段,然后通过postman来调用我们编写的代码。
'Query',
'fields' => [
'phoneNumber' => [
'type' => Type::int(),
'resolve' => function () {
return 1875555555;
}
]
],
]);
$schema = new Schema([
'query' => $queryType,
]);
$rawInput = file_get_contents('php://input');
$input = json_decode($rawInput, true);
$query = $input['query'];
$variableValues = isset($input['variables']) ? $input['variables'] : null;
try {
$rootValue = ['prefix' => 'prefix: '];
$result = GraphQL::executeQuery($schema, $query, $rootValue, null, $variableValues);
$output = $result->toArray();
} catch (\Exception $e) {
$output = [
'errors' => [
[
'message' => $e->getMessage()
]
]
];
}
header('Content-Type: application/json');
echo json_encode($output);2、使用postman来调用我们刚刚编写的代码,以下是我们查询结果的示例

介绍
从上面的示例中,我们可以看到示例主要引入了4个类
use GraphQL\Type\Schema; use GraphQL\Type\Definition\ObjectType; use GraphQL\Type\Definition\Type; use GraphQL\GraphQL;
Schema 类
Schema 是类型层次结构的容器,它接受构造函数中的根类型并向内部 GrahpQL 工具提供接收你的类型信息的方法。
配置选项
包含以下选项的数组:
| Option | Type | Notes |
|---|---|---|
| query | ObjectType | 必须。读取 API 中包含根级字段的对象类型 (通常命名为 "Query"),用于读取数据 |
| mutation | ObjectType | 写入 API 中包含根级字段的对象类型 (通常命名为 "Mutation"),数据变更时会用到 |
| subscription | ObjectType | 保留用于将来的描述实现。目前表现为 graphql-js自检查询的兼容,用于各种客户端 (如 Relay 或 GraphiQL) |
| directives | Directive[] | 默认包含内建指令 @skip和 @include。 如果你传递自定义指令并且依然想使用内建指令,请声明添加它们。例如: array_merge(GraphQL::getStandardDirectives(), [$myCustomDirective]); |
| types | ObjectType[] | 对象类型类表,它在静态 schema 解析期间是不能被 graphql-php发现的。 大多数情况下,对象类型未曾在字段中被直接引用,但它依然是 schema 的一部分时会用到,因为它实现了一个在 resolveType中调用解析为此对象类型的接口。 请注意,您在此处无需传递所有类型 ,它只是具体用例的解决方法。 |
| typeLoader | callable | function($name)返回给定的类型实例名称。 多次调用情况下,必须返回同样的实例。 查阅下文延迟类型加载部分。 |
ObjectType类
GraphQL\Type\Definition\ObjectType
对象类型是典型的 GraphQL 应用程序中使用最频繁的基元。
配置选项
| Option | Type | Notes |
|---|---|---|
| name | string | 必须。Schema中此对象的唯一名称 |
| fields | array or callable | 必须。描述对象字段或可调用返回此类数组的数组。 |
| description | string | 呈现于客户端的参数文本说明(例如:用于 GraphiQL 自动生成文档 ) |
| interfaces | array or callable | 此类型实现的接口列表或返回此类列表的可调用接口。 |
内置标量类型
字段参数
GraphQL 对象类型上的所有字段都有 0 个或多个参数,使用在 args的字段定义上。每个参数数组参考以下说明:
| Option | Type | Notes |
|---|---|---|
| name | string | 必须。参数名称。 为空时,使用 args数组键值 |
| type | Type | 必须。 |
| description | string | 呈现于客户端的参数文本说明 |
| defaultValue | scalar | 当前参数默认值 |
示例
$queryType = new ObjectType([
'name' => 'Query',
'fields' => [
'phoneNumber' => [
'type' => Type::int(),
'resolve' => 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个字段,分别是phoneNumber和echo,其中phoneNumber为 Type::int()类型,echo 为Type::string()类型,同时echo字段带有一个参数为message
'Query',
'fields' => [
'phoneNumber' => [
'type' => Type::int(),
'resolve' => function () {
return 1875555555;
}
],
'echo' => [
'type' => Type::string(),
'args' => [
'message' => Type::string(),
],
'resolve' => function ($root, $args) {
return 'echo msg result:' . ($args['message'] ?? 'nothing');
}
],
],
]);
$schema = new Schema([
'query' => $queryType
]);
$rawInput = file_get_contents('php://input');
$input = json_decode($rawInput, true);
$query = $input['query'];
$variableValues = isset($input['variables']) ? $input['variables'] : null;
try {
$rootValue = ['prefix' => 'prefix: '];
$result = GraphQL::executeQuery($schema, $query, $rootValue, null, $variableValues);
$output = $result->toArray();
} catch (\Exception $e) {
$output = [
'errors' => [
[
'message' => $e->getMessage()
]
]
];
}
header('Content-Type: application/json');
echo json_encode($output);执行示例代码结果

我们可以看到,在请求时我们传了phoneNumber和echo两个字段,并且message为test。
对象示例
我们在上面说过,对象类型是典型的 GraphQL 应用程序中使用最频繁的基元,一个对象类型里面可以包含宁外一个对象类型,我们可以新定义一个名为$userType的ObjectType,然后在oneUser指定它的类型为$userType,这样我们执行查询的时候,oneUser就会返回一个对象。
'userType',
'description' => '用户详情',
'fields' => [
'uid' => [
'type' => Type::int(),
'description' => '用户ID'
],
'name' => Type::string()
]
]);
$queryType = new ObjectType([
'name' => 'Query',
'fields' => [
'oneUser' => [
'type' => $userType, // 我们这里指定type为我们上面创建的$userType
'description' => '用户列表',
'args' => [
'uid' => [
'type' => Type::int(),
'defaultValue' => 222
]
],
'resolve' => function($root, $args) {
return [
"uid" => $args['user_id'] ?? 3,
"name" => "xzl",
];
}
],
]
]);
$schema = new Schema([
'query' => $queryType
]);
$rawInput = file_get_contents('php://input');
$input = json_decode($rawInput, true);
$query = $input['query'];
$variableValues = isset($input['variables']) ? $input['variables'] : null;
try {
$rootValue = ['prefix' => 'prefix: '];
$result = GraphQL::executeQuery($schema, $query, $rootValue, null, $variableValues);
$output = $result->toArray();
} catch (\Exception $e) {
$output = [
'errors' => [
[
'message' => $e->getMessage()
]
]
];
}
header('Content-Type: application/json');
echo json_encode($output);执行示例代码结果

列表示例
在平时的开发请求中,我们从后端接口获取数据的时候,大部分都是以列表的形式返回的,我们可以通过Type::listOf方法来指定我们返回的字段是一个列表。
1,
"name" => "name1"
],
[
"uid" => 2,
"name" => "name2"
],
[
"uid" => 3,
"name" => "name3"
],
[
"uid" => 4,
"name" => "name4"
]
];
return array_slice($user, 0, $limit);
}
}
$userType = new ObjectType([
'name' => 'userType',
'description' => '用户详情',
'fields' => [
'uid' => [
'type' => Type::int(),
'description' => '用户ID'
],
'name' => Type::string()
]
]);
$queryType = new ObjectType([
'name' => 'Query',
'fields' => [
'users' => [
'type' => Type::listOf($userType),
'description' => '用户列表',
'args' => [
'limit' => [
'type' => Type::int(),
'description' => '限制条数',
'defaultValue' => 10
]
],
'resolve' => function($root, $args) {
return User::getUserLimit($args['limit']);
}
]
]
]);
$schema = new Schema([
'query' => $queryType
]);
$rawInput = file_get_contents('php://input');
$input = json_decode($rawInput, true);
$query = $input['query'];
$variableValues = isset($input['variables']) ? $input['variables'] : null;
try {
$rootValue = ['prefix' => 'prefix: '];
$result = GraphQL::executeQuery($schema, $query, $rootValue, null, $variableValues);
$output = $result->toArray();
} catch (\Exception $e) {
$output = [
'errors' => [
[
'message' => $e->getMessage()
]
]
];
}
header('Content-Type: application/json');
echo json_encode($output);执行示例代码结果

从上面结果可以看到,我们传了limit参数为2,最终从我们模拟的数据里面取出了2条数据
使用类型语言
在上面的示例中,如果我们代码返回的数据比较复杂时,需要编写大量的代码,通过GraphQL类型语言,我们可以减少代码量,使代码看上去更加简洁,这是一个用 GraphQL 类型语言定义的简单 Schema示例。
function($rootValue, $args, $context) {
return $args['x'] + $args['y'];
},
'echo' => function($rootValue, $args, $context) {
return $rootValue['prefix'] . ($args['message'] ?? 'no echo');
},
'show_test' => function($rootValue, $args, $context) {
return [
'content' => 'show_content',
'text' => 'xxxx xxx'
];
},
'show_test_arr' => function($rootValue, $args, $context) {
return [
[
'content' => 'show_content',
'text' => 'xxxx xxx'
],
[
'content' => 'show_content_2',
'text' => 'xxxx xxx_2'
]
];
},
'prefix' => 'from test:',
"graph_test" => "graphql_test"
];;
$result = GraphQL::executeQuery($schema, $query, $rootValue, null, $variableValues);
$output = $result->toArray();
} catch (\Exception $e) {
\GraphQL\Server\StandardServer::send500Error($e);
}
header('Content-Type: application/json');
echo json_encode($output);执行示例代码结果

关于“PHP中怎么安装和使用GraphQL”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,使各位可以学到更多知识,如果觉得文章不错,请把它分享出去让更多的人看到。
当前文章:PHP中怎么安装和使用GraphQL
文章网址:http://www.jxjierui.cn/article/ihhgje.html


咨询
建站咨询
