1. 前提条件
在开始构建 PHP GraphQL 后端之前,您需要确保已经满足以下前提条件:
- PHP 7.2+
- Composer
- GraphQL PHP 库
2. 初始化项目
首先,使用 Composer 创建一个新的 PHP 项目。
composer create-project --prefer-dist laravel/laravel your-project-name
接下来,安装 GraphQL PHP 库。
composer require graphql/graphql:^0.14
3. 创建 GraphQL Schema
GraphQL Schema 定义了您的 API 的结构,包括数据类型、查询和突变。在 app/GraphQL/Types
目录下创建一个新的文件 UserType.php
,内容如下:
namespace AppGraphQLTypes;
use GraphQLTypeDefinitionType;
use GraphQLTypeDefinitionObjectType;
class UserType extends ObjectType
{
public function __construct()
{
$config = [
"name" => "User",
"description" => "A user",
"fields" => [
"id" => [
"type" => Type::string(),
"description" => "The ID of the user"
],
"name" => [
"type" => Type::string(),
"description" => "The name of the user"
],
"email" => [
"type" => Type::string(),
"description" => "The email of the user"
],
]
];
parent::__construct($config);
}
}
同样的方法,分别在 app/GraphQL/Types
目录下创建 QueryType.php
和 MutationType.php
文件,定义查询和突变类型。
4. 定义查询和突变解析器
接下来,需要定义查询和突变解析器,这些解析器将处理 GraphQL 请求并返回数据。在 app/GraphQL/Resolvers
目录下创建文件 UserResolver.php
,内容如下:
namespace AppGraphQLResolvers;
use AppUser;
use GraphQLTypeDefinitionResolveInfo;
class UserResolver
{
/**
* 获取所有用户
*
* @param mixed $rootValue
* @param array $args
* @param mixed $context
* @param ResolveInfo $info
* @return mixed
*/
public function all($rootValue, array $args, $context, ResolveInfo $info)
{
return User::all();
}
/**
* 获取单个用户
*
* @param mixed $rootValue
* @param array $args
* @param mixed $context
* @param ResolveInfo $info
* @return mixed
*/
public function find($rootValue, array $args, $context, ResolveInfo $info)
{
return User::find($args["id"]);
}
/**
* 创建一个用户
*
* @param mixed $rootValue
* @param array $args
* @param mixed $context
* @param ResolveInfo $info
* @return mixed
*/
public function create($rootValue, array $args, $context, ResolveInfo $info)
{
$user = new User();
$user->name = $args["name"];
$user->email = $args["email"];
$user->save();
return $user;
}
/**
* 更新一个用户
*
* @param mixed $rootValue
* @param array $args
* @param mixed $context
* @param ResolveInfo $info
* @return mixed
*/
public function update($rootValue, array $args, $context, ResolveInfo $info)
{
$user = User::find($args["id"]);
$user->name = $args["name"];
$user->email = $args["email"];
$user->save();
return $user;
}
/**
* 删除一个用户
*
* @param mixed $rootValue
* @param array $args
* @param mixed $context
* @param ResolveInfo $info
* @return mixed
*/
public function delete($rootValue, array $args, $context, ResolveInfo $info)
{
$user = User::find($args["id"]);
$user->delete();
return $user;
}
}
5. 创建 GraphQL 服务提供者
创建一个 GraphQL 服务提供者 app/Providers/GraphQLServiceProvider.php
,内容如下:
namespace AppProviders;
use IlluminateSupportServiceProvider;
use GraphQLTypeSchema;
use GraphQLServerServerConfig;
use GraphQLServerStandardServer;
use NuwaveLighthouseSchemaTypeRegistry;
use NuwaveLighthouseGraphQL;
class GraphQLServiceProvider extends ServiceProvider
{
/**
* Bootstrap the application services.
*
* @return void
*/
public function boot()
{
$this->app->singleton(
Schema::class,
function () {
$schema = new Schema([
"query" => TypeRegistry::get(GraphQL::TYPE_QUERY),
"mutation" => TypeRegistry::get(GraphQL::TYPE_MUTATION)
]);
return $schema;
}
);
$this->app->singleton(
StandardServer::class,
function () {
$config = ServerConfig::create();
return new StandardServer($config);
}
);
}
/**
* Register the application services.
*
* @return void
*/
public function register()
{
$this->app->make(GraphQL::class);
}
}
6. 注册 GraphQL 服务提供者
在 config/app.php
文件中注册 GraphQL 服务提供者:
"providers" => [
// Other providers
AppProvidersGraphQLServiceProvider::class,
]
7. 设置 GraphQL 路由
在 routes/api.php
文件中设置 GraphQL 路由:
use GraphQLServerStandardServer;
Route::post("/graphql", function (StandardServer $server) {
return $server->process();
});
8. 启动 GraphQL 服务
在 public/index.php
文件中启动 GraphQL 服务:
define("LARAVEL_START", microtime(true));
require __DIR__."/../bootstrap/autoload.php";
$app = require_once __DIR__."/../bootstrap/app.php";
$server = $app->make(StandardServer::class);
$server->process();
9. 测试 GraphQL API
现在您可以使用您的 GraphQL 客户机或工具来测试您的 GraphQL API。例如,您可以使用 GraphiQL IDE 来发送 GraphQL 查询和突变。
10. 结语
通过以上步骤,您已经成功构建了一个功能完整的 PHP GraphQL 后端。您可以继续扩展您的 GraphQL Schema 和解析器,以满足您的 API 需求。