广告
返回顶部
首页 > 资讯 > 后端开发 > PHP编程 >PHP中怎么安装和使用GraphQL
  • 266
分享到

PHP中怎么安装和使用GraphQL

2023-06-14 23:06:12 266人浏览 安东尼
摘要

这篇文章将为大家详细讲解有关PHP中怎么安装和使用GraphQL,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。php是什么语言php,一个嵌套的缩写名称,是英文超级文本预处理语言(PHP:Hypertex

这篇文章将为大家详细讲解有关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/1book/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

开始

安装完成之后,我们先编写一个简单示例,来看看graphql-php怎么用,具体代码如下:这段代码中,我们定义了一个名为phoneNumber的字段,然后通过postman来调用我们编写的代码。

<?phprequire_once __DIR__ . '/vendor/autoload.php';use GraphQL\Type\Schema;use GraphQL\Type\Definition\ObjectType;use GraphQL\Type\Definition\Type;use GraphQL\GraphQL;$queryType = new ObjectType([    'name' => '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);

使用postman来调用我们刚刚编写的代码,以下是我们查询结果的示例

PHP中怎么安装和使用GraphQL

介绍

从上面的示例中,我们可以看到示例主要引入了4个类

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

Schema 类

Schema 是类型层次结构的容器,它接受构造函数中的根类型并向内部 GrahpQL 工具提供接收你的类型信息的方法。

配置选项

包含以下选项的数组

OptionTypeNotes
queryObjectType必须。 读取 API 中包含根级字段的对象类型 (通常命名为 "Query"),用于读取数据
mutationObjectType写入 API 中包含根级字段的对象类型  (通常命名为 "Mutation"),数据变更时会用到
subscriptionObjectType保留用于将来的描述实现。目前表现为 graphql-js 自检查询的兼容,用于各种客户端 (如 Relay 或 GraphiQL)
directivesDirective[]默认包含内建指令 @skip@include

如果你传递自定义指令并且依然想使用内建指令,请声明添加它们。例如:

array_merge(GraphQL::getStandardDirectives(), [$myCustomDirective]);
typesObjectType[]对象类型类表,它在静态 schema 解析期间是不能被 graphql-php 发现的。

大多数情况下,对象类型未曾在字段中被直接引用,但它依然是 schema 的一部分时会用到,因为它实现了一个在 resolveType 中调用解析为此对象类型的接口。

请注意,您在此处无需传递所有类型 ,它只是具体用例的解决方法。
typeLoadercallablefunction($name) 返回给定的类型实例名称。 多次调用情况下,必须返回同样的实例。 查阅下文延迟类型加载部分。

ObjectType类

GraphQL\Type\Definition\ObjectType

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

配置选项
OptionTypeNotes
namestring必须。 Schema 中此对象的唯一名称
fieldsarray or callable必须。 描述对象字段或可调用返回此类数组的数组。
descriptionstring呈现于客户端的参数文本说明(例如:用于 GraphiQL 自动生成文档 )
interfacesarray or callable此类型实现的接口列表或返回此类列表的可调用接口。
内置标量类型
<?phpuse GraphQL\Type\Definition\Type;// 内置标量类型Type::string();  // String 类型Type::int();     // Int 类型Type::float();   // Float 类型Type::boolean(); // Boolean 类型Type::id();      // ID 类型

字段参数

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

OptionTypeNotes
namestring必须。 参数名称。 为空时,使用 args 数组键值
typeType必须。
descriptionstring呈现于客户端的参数文本说明
defaultValueScalar当前参数默认值

示例

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

GraphQL 类

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

executeQuery 方法的参数说明

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

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

<?phprequire_once __DIR__ . '/vendor/autoload.php';use GraphQL\Type\Definition\ObjectType;use GraphQL\Type\Definition\Type;use GraphQL\GraphQL;use GraphQL\Type\Schema;$queryType = new ObjectType([    'name' => '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);
执行示例代码结果

PHP中怎么安装和使用GraphQL

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

对象示例

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

<?phprequire_once __DIR__ . '/vendor/autoload.php';use GraphQL\Type\Definition\ObjectType;use GraphQL\Type\Definition\Type;use GraphQL\GraphQL;use GraphQL\Type\Schema;$userType = new ObjectType([    'name' => '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);
执行示例代码结果

PHP中怎么安装和使用GraphQL

列表示例

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

<?phprequire_once __DIR__ . '/vendor/autoload.php';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([    '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);
执行示例代码结果

PHP中怎么安装和使用GraphQL

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

使用类型语言

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

<?phprequire_once __DIR__ . '/vendor/autoload.php';use GraphQL\GraphQL;use GraphQL\Utils\BuildSchema;// graph.graphql  文件内容$graph =<<<GRAPHschema {  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('php://input');$input = json_decode($rawInput, true);$query = $input['query'];$variableValues = isset($input['variables']) ? $input['variables'] : null;try {    $rootValue = [        'sum' => 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”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,使各位可以学到更多知识,如果觉得文章不错,请把它分享出去让更多的人看到。

--结束END--

本文标题: PHP中怎么安装和使用GraphQL

本文链接: https://www.lsjlt.com/news/275934.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • PHP中怎么安装和使用GraphQL
    这篇文章将为大家详细讲解有关PHP中怎么安装和使用GraphQL,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。php是什么语言php,一个嵌套的缩写名称,是英文超级文本预处理语言(PHP:Hypertex...
    99+
    2023-06-14
  • graphQL怎么在前端vue中使用
    这篇文章主要介绍“graphQL怎么在前端vue中使用”,在日常操作中,相信很多人在graphQL怎么在前端vue中使用问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”graphQL怎么在前端vue中使用”的疑...
    99+
    2023-07-05
  • PHP中安装和使用xdebug
    文章目录 前言配置详解总结 前言 本文已收录于PHP全栈系列专栏:PHP快速入门与实战 作为一个程序员,千万不要说你没有用过debug工具,不然有点说不过去。xdebug是PHP语言一个...
    99+
    2023-09-20
    php 开发语言 linux debug xdebug
  • 怎么使用Git安装PHP
    本篇内容介绍了“怎么使用Git安装PHP”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!步骤1:更新系统首先,您需要使用以下命令更新系统:su...
    99+
    2023-07-06
  • php composer怎么安装使用
    这篇文章主要介绍“php composer怎么安装使用”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“php composer怎么安装使用”文章能帮助大家解决问题。php-composer的安装与使用...
    99+
    2023-06-26
  • linux中CoreFreq怎么安装和使用
    今天小编给大家分享一下linux中CoreFreq怎么安装和使用的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我...
    99+
    2023-02-23
    linux corefreq
  • mongodb中怎么安装和使用pymongo
    mongodb中怎么安装和使用pymongo,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。(1) mongodb的安装下载tgz解压后,需要添...
    99+
    2022-10-18
  • golang中怎么安装和使用gcc
    Golang是一种开源的编程语言,它的出现给予了开发者们强大的工具和灵活性,从而提高了产品的质量和效率。在使用Golang进行开发过程中,可能会需要用到gcc工具,在这篇文章中,我们将了解如何安装gcc以及在Golang中使用gcc。一、安...
    99+
    2023-05-14
  • Linux中怎么安装和使用Terminator
    本篇内容介绍了“Linux中怎么安装和使用Terminator”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!Terminator 是一个命令...
    99+
    2023-06-27
  • Centos中怎么安装和使用svn
    本篇内容介绍了“Centos中怎么安装和使用svn”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!SVN是Subversion的简称,是一个开...
    99+
    2023-06-28
  • Mac中MacPorts怎么安装和使用
    要在Mac上安装和使用MacPorts,您可以按照以下步骤操作: 下载安装MacPorts:打开终端应用程序,输入以下命令并按回...
    99+
    2023-10-22
    Mac MacPorts
  • Linux中怎么安装和使用ttyload
    这篇文章主要讲解了“Linux中怎么安装和使用ttyload”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Linux中怎么安装和使用ttyload”吧!ttyload是一个轻量级的实用程序,...
    99+
    2023-06-27
  • Python中怎么安装和使用pyinstrument
    这篇文章主要介绍了Python中怎么安装和使用pyinstrument的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Python中怎么安装和使用pyinstrument文章都会有所收获,下面我们一起来看看吧。一...
    99+
    2023-06-29
  • Linux中怎么安装和使用Geeknote
    这篇文章主要介绍了Linux中怎么安装和使用Geeknote的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Linux中怎么安装和使用Geeknote文章都会有所收获,下面我们一起来看看吧。Geeknote简介:...
    99+
    2023-06-28
  • php中ThinkPHP怎么下载和安装
    小编给大家分享一下php中ThinkPHP怎么下载和安装,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!PHP开发环境搭建工具有哪些一、phpStudy,是一个新手...
    99+
    2023-06-14
  • linux怎么使用yum安装php
    linux使用yum安装php的方法:1、执行“mkdir /usr/local/php”命令;2、下载yum源的更新安装包;3、安装相关yum源安装包;4、通过“yum install”命令安装php即可。本教程操作环境:centos7系...
    99+
    2023-05-14
    php yum
  • 使用yum怎么安装php curl
    这期内容当中小编将会给大家带来有关使用yum怎么安装php curl,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。yum怎么安装php curl?Linux下安装PHP的curl扩展先安装依赖包:yum&...
    99+
    2023-06-15
  • opengl怎么安装和使用
    要安装和使用OpenGL,需要按照以下步骤进行操作:1. 下载和安装OpenGL开发工具包(OpenGL SDK):可以从OpenG...
    99+
    2023-09-14
    opengl
  • FFmpeg怎么安装和使用
    要安装FFmpeg,可以按照以下步骤进行操作:1. 在FFmpeg官方网站(https://ffmpeg.org/)上下载最新版本的...
    99+
    2023-09-15
    Ffmpeg
  • flexbuilder怎么安装和使用
    Flex Builder是一款用于Adobe Flex开发的集成开发环境(IDE),下面是安装和使用Flex Builder的步骤:...
    99+
    2023-09-25
    flexbuilder
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作