首頁 > 後端開發 > php教程 > 詳解PHP中如何安裝使用GraphQL

詳解PHP中如何安裝使用GraphQL

青灯夜游
發布: 2023-04-09 22:52:01
轉載
4200 人瀏覽過

這篇文章帶大家了解GraphQL,並詳細介紹PHP中安裝和使用GraphQL的方法。有一定的參考價值,有需要的朋友可以參考一下,希望對大家有幫助。

詳解PHP中如何安裝使用GraphQL

關於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
登入後複製

開始

1、安裝完成之後,我們先寫一個簡單範例,來看看graphql-php怎麼用,具體程式碼如下:這段程式碼中,我們定義了一個名為phoneNumber的字段,然後透過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、使用postman來呼叫我們剛剛寫的程式碼,以下是我們查詢結果的範例

詳解PHP中如何安裝使用GraphQL

##介紹

從上面的範例中,我們可以看到範例主要引入了4個類別

use GraphQL\Type\Schema;
use GraphQL\Type\Definition\ObjectType;
use GraphQL\Type\Definition\Type;
use GraphQL\GraphQL;
登入後複製

#Schema 類別

Schema 是類型層次結構的容器,它接受建構函式中的根類型並向內部GrahpQL 工具提供接收你的類型資訊的方法。

設定選項

包含下列選項的陣列:

OptionTypeNotesquerymutation寫入API 中包含根級欄位的物件類型 (通常命名為"Mutation"),資料變更時會用到subscription保留用於未來的描述實作。目前表現為directives預設包含內建指令types物件類型類別表,它在靜態schema 解析期間是不能被typeLoader

ObjectType类

GraphQL\Type\Definition\ObjectType
登入後複製

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

配置选项

#ObjectType必須。 讀取API 中包含根級字段的物件類型(通常命名為"Query"),用於讀取資料
# ObjectType
ObjectTypegraphql-js 自檢查詢的相容,用於各種客戶端(如Relay 或GraphiQL)
#Directive[]@skip@include
如果你傳遞自訂指令並且仍然想使用內建指令,請聲明添加它們。例如:


array_merge(GraphQL::getStandardDirectives(), [$myCustomDirective]);
#ObjectType[]graphql-php 發現的。
大多數情況下,物件類型未曾在欄位中直接被引用,但它仍然是schema 的一部分時會用到,因為它實作了一個在
resolveType 中呼叫解析為此物件類型的介面。
請注意,您在此處無需傳遞所有類型 ,它只是具體用例的解決方法。
callable#function($name) 傳回給定的類型實例名稱。多次呼叫情況下,必須傳回同樣的實例。查閱下文延遲類型載入部分。
OptionTypeNotes
namestring必须。 Schema 中此对象的唯一名称
fieldsarray or callable必须。 描述对象字段或可调用返回此类数组的数组。
descriptionstring呈现于客户端的参数文本说明(例如:用于 GraphiQL 自动生成文档 )
interfacesarray 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 的字段定义上。每个参数数组参考以下说明:

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

示例

$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 方法的参数说明

参数类型说明
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

<?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);
登入後複製

执行示例代码结果

詳解PHP中如何安裝使用GraphQL

我们可以看到,在请求时我们传了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);
登入後複製

执行示例代码结果

詳解PHP中如何安裝使用GraphQL

列表示例

在平时的开发请求中,我们从后端接口获取数据的时候,大部分都是以列表的形式返回的,我们可以通过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);
登入後複製

执行示例代码结果

詳解PHP中如何安裝使用GraphQL

从上面结果可以看到,我们传了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);
登入後複製

执行示例代码结果

詳解PHP中如何安裝使用GraphQL

参考

graphql.cn/learn/

learnku.com/docs/graphq…

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

以上是詳解PHP中如何安裝使用GraphQL的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:juejin.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板