PHP中怎么安装和使用GraphQL
导读:本文共9739.5字符,通常情况下阅读需要32分钟。同时您也可以点击右侧朗读,来听本文内容。按键盘←(左) →(右) 方向键可以翻页。
摘要: php是什么语言php,一个嵌套的缩写名称,是英文超级文本预处理语言(PHP:Hypertext Preprocessor)的缩写。PHP 是一种 HTML 内嵌式的语言,PHP与微软的ASP颇有几分相似,都是一种在服务器端执行的嵌入HTML文档的脚本语言,语言的风格有类似于C语言,现在被很多的网站编程人员广泛的运用。关于 GraphQLGraphQL 是一种现... ...
目录
(为您整理了一些要点),点击可以直达。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包
composerrequirewebonyx/graphql-php
开始
1、安装完成之后,我们先编写一个简单示例,来看看graphql-php怎么用,具体代码如下:这段代码中,我们定义了一个名为phoneNumber
的字段,然后通过postman来调用我们编写的代码。
<?phprequire_once__DIR__.'/vendor/autoload.php';useGraphQL\Type\Schema;useGraphQL\Type\Definition\ObjectType;useGraphQL\Type\Definition\Type;useGraphQL\GraphQL;$queryType=newObjectType(['name'=>'Query','fields'=>['phoneNumber'=>['type'=>Type::int(),'resolve'=>function(){return1875555555;}]],]);$schema=newSchema(['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');echojson_encode($output);
2、使用postman来调用我们刚刚编写的代码,以下是我们查询结果的示例
介绍
从上面的示例中,我们可以看到示例主要引入了4个类
useGraphQL\Type\Schema;useGraphQL\Type\Definition\ObjectType;useGraphQL\Type\Definition\Type;useGraphQL\GraphQL;
Schema 类
Schema 是类型层次结构的容器,它接受构造函数中的根类型并向内部 GrahpQL 工具提供接收你的类型信息的方法。
配置选项
包含以下选项的数组:
ObjectType
必须。 读取 API 中包含根级字段的对象类型 (通常命名为 "Query"),用于读取数据mutationObjectType
写入 API 中包含根级字段的对象类型 (通常命名为 "Mutation"),数据变更时会用到subscriptionObjectType
保留用于将来的描述实现。目前表现为 graphql-js 自检查询的兼容,用于各种客户端 (如 Relay 或 GraphiQL)directivesDirective[]
默认包含内建指令 @skip 和 @include 。如果你传递自定义指令并且依然想使用内建指令,请声明添加它们。例如:
array_merge(GraphQL::getStandardDirectives(), [$myCustomDirective]);types
ObjectType[]
对象类型类表,它在静态 schema 解析期间是不能被 graphql-php 发现的。大多数情况下,对象类型未曾在字段中被直接引用,但它依然是 schema 的一部分时会用到,因为它实现了一个在 resolveType 中调用解析为此对象类型的接口。
请注意,您在此处无需传递所有类型 ,它只是具体用例的解决方法。typeLoader
callable
function($name) 返回给定的类型实例名称。 多次调用情况下,必须返回同样的实例。 查阅下文延迟类型加载部分。ObjectType类
GraphQL\Type\Definition\ObjectType
对象类型是典型的 GraphQL 应用程序中使用最频繁的基元。
配置选项
string
必须。 Schema 中此对象的唯一名称fieldsarray
or callable
必须。 描述对象字段或可调用返回此类数组的数组。descriptionstring
呈现于客户端的参数文本说明(例如:用于 GraphiQL 自动生成文档 )interfacesarray
or callable
此类型实现的接口列表或返回此类列表的可调用接口。内置标量类型
<?phpuseGraphQL\Type\Definition\Type;//内置标量类型Type::string();//String类型Type::int();//Int类型Type::float();//Float类型Type::boolean();//Boolean类型Type::id();//ID类型
字段参数
GraphQL 对象类型上的所有字段都有 0 个或多个参数,使用在 args 的字段定义上。每个参数数组参考以下说明:
string
必须。 参数名称。 为空时,使用 args 数组键值typeType
必须。descriptionstring
呈现于客户端的参数文本说明defaultValuescalar
当前参数默认值示例
$queryType=newObjectType(['name'=>'Query','fields'=>['phoneNumber'=>['type'=>Type::int(),'resolve'=>function(){return1875555555;}]],]);
GraphQL 类
GraphQL类主要在查询的时候用到,我们可以用 GraphQL::executeQuery 方法来执行查询
executeQuery 方法的参数说明
GraphQL\Type\Schema
必须。 Schema应用实例queryStringstring
or GraphQL\Language\AST\DocumentNode
必须。 解析,验证并执行现有的 GraphQL 查询字符。 如果在执行之前解析其他查询,则在此处传递相应的 AST 文档节点来避免新的解析。rootValuemixed
表示数据图结构的基础值。作为Query type 字段解析传递的第一个参数。如果现有该值已被 Query type 解析过,则可忽略或设置为 null
值。contextmixed
字段解析器的共享信息。 常用来传递已登录用户信息,位置详情等。它将用在所有字段解析器的第 3 个参数。variableValues
array
变量的映射,该值将随同查询字符串一起传递。请查阅 GraphQL官网查询变量的相关。operationNamestring
指定请求方可执行的操作, 防止条件查询字符包含多级操作。fieldResolvercallable
Schema 参数 schema 中未实现的解析器函数。validationRulesarray
查询验证规则组,默认所有规则。空数组将跳过查询验证 (对于持久化查询将会比较方便,查询会在持久化之前默认已验证,并在执行期间假设符合规则)。useGraphQL\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
<?phprequire_once__DIR__.'/vendor/autoload.php';useGraphQL\Type\Definition\ObjectType;useGraphQL\Type\Definition\Type;useGraphQL\GraphQL;useGraphQL\Type\Schema;$queryType=newObjectType(['name'=>'Query','fields'=>['phoneNumber'=>['type'=>Type::int(),'resolve'=>function(){return1875555555;}],'echo'=>['type'=>Type::string(),'args'=>['message'=>Type::string(),],'resolve'=>function($root,$args){return'echomsgresult:'.($args['message']??'nothing');}],],]);$schema=newSchema(['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');echojson_encode($output);
执行示例代码结果
我们可以看到,在请求时我们传了phoneNumber
和echo
两个字段,并且message
为test
。
对象示例
我们在上面说过,对象类型是典型的 GraphQL 应用程序中使用最频繁的基元,一个对象类型里面可以包含宁外一个对象类型,我们可以新定义一个名为$userType
的ObjectType
,然后在oneUser
指定它的类型为$userType
,这样我们执行查询的时候,oneUser
就会返回一个对象。
<?phprequire_once__DIR__.'/vendor/autoload.php';useGraphQL\Type\Definition\ObjectType;useGraphQL\Type\Definition\Type;useGraphQL\GraphQL;useGraphQL\Type\Schema;$userType=newObjectType(['name'=>'userType','description'=>'用户详情','fields'=>['uid'=>['type'=>Type::int(),'description'=>'用户ID'],'name'=>Type::string()]]);$queryType=newObjectType(['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=newSchema(['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');echojson_encode($output);
执行示例代码结果
列表示例
在平时的开发请求中,我们从后端接口获取数据的时候,大部分都是以列表的形式返回的,我们可以通过Type::listOf
方法来指定我们返回的字段是一个列表。
<?phprequire_once__DIR__.'/vendor/autoload.php';useGraphQL\Type\Definition\ObjectType;useGraphQL\Type\Definition\Type;useGraphQL\GraphQL;useGraphQL\Type\Schema;classUser{//模拟从数据库取数据publicstaticfunctiongetUserLimit($limit){$user=[["uid"=>1,"name"=>"name1"],["uid"=>2,"name"=>"name2"],["uid"=>3,"name"=>"name3"],["uid"=>4,"name"=>"name4"]];returnarray_slice($user,0,$limit);}}$userType=newObjectType(['name'=>'userType','description'=>'用户详情','fields'=>['uid'=>['type'=>Type::int(),'description'=>'用户ID'],'name'=>Type::string()]]);$queryType=newObjectType(['name'=>'Query','fields'=>['users'=>['type'=>Type::listOf($userType),'description'=>'用户列表','args'=>['limit'=>['type'=>Type::int(),'description'=>'限制条数','defaultValue'=>10]],'resolve'=>function($root,$args){returnUser::getUserLimit($args['limit']);}]]]);$schema=newSchema(['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');echojson_encode($output);
执行示例代码结果
从上面结果可以看到,我们传了limit
参数为2,最终从我们模拟的数据里面取出了2条数据
使用类型语言
在上面的示例中,如果我们代码返回的数据比较复杂时,需要编写大量的代码,通过GraphQL类型语言,我们可以减少代码量,使代码看上去更加简洁,这是一个用 GraphQL 类型语言定义的简单 Schema示例。
<?phprequire_once__DIR__.'/vendor/autoload.php';useGraphQL\GraphQL;useGraphQL\Utils\BuildSchema;//graph.graphql文件内容$graph=<<<GRAPHschema{query:Query}typeQuery{graph_test:Stringecho(message:String):Stringshow_test:Showshow_test_arr:[Show]}typeShow{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']??'noecho');},'show_test'=>function($rootValue,$args,$context){return['content'=>'show_content','text'=>'xxxxxxx'];},'show_test_arr'=>function($rootValue,$args,$context){return[['content'=>'show_content','text'=>'xxxxxxx'],['content'=>'show_content_2','text'=>'xxxxxxx_2']];},'prefix'=>'fromtest:',"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');echojson_encode($output);
执行示例代码结果
</div> <div class="zixun-tj-product adv-bottom"></div> </div> </div> <div class="prve-next-news">
PHP中怎么安装和使用GraphQL的详细内容,希望对您有所帮助,信息来源于网络。