本文目录导读:

- webonyx/graphql-php(最推荐)
- Lighthouse(Laravel专属)
- GraphQLite(注解驱动)
- Overblog/GraphQLBundle(Symfony专用)
- PHP GraphQL Client(客户端)
- 选择建议
- 实战示例(webonyx)
在选择PHP的GraphQL库时,主要看你的项目需求和框架环境,以下是目前最主流的几个选择:
webonyx/graphql-php(最推荐)
官方参考实现,Star最多,生态最完善。
优点:
- 完全遵循GraphQL规范
- 文档清晰完整,学习资源多
- 支持Schema定义、解析器、类型系统
- 性能较好,内存优化到位
- 社区活跃,更新频繁
缺点:
- 需要手写Schema定义(学习曲线)
- 代码量相对较多
适用场景: 大多数项目,特别是需要完全控制Schema和解析逻辑的场景。
use GraphQL\GraphQL;
use GraphQL\Type\Schema;
use GraphQL\Type\Definition\ObjectType;
$queryType = new ObjectType([
'name' => 'Query',
'fields' => [
'hello' => [
'type' => Type::string(),
'resolve' => fn() => 'Hello World!'
]
]
]);
$schema = new Schema(['query' => $queryType]);
$result = GraphQL::executeQuery($schema, $queryString);
Lighthouse(Laravel专属)
基于graphql-php的Laravel扩展包,声明式Schema。
优点:
- 使用注释/注解定义Schema,代码量少
- 与Laravel Eloquent深度集成
- 自动生成CRUD操作
- 内置缓存、验证、授权
缺点:
- 仅限Laravel框架
- 过度封装可能限制灵活性
# 在Model中使用注解
/**
* @property string $name
* @property string $email
*/
class User extends Model
{
// 无需额外代码
}
# 自动生成Schema
type User {
id: ID!
name: String!
email: String!
}
GraphQLite(注解驱动)
同样基于graphql-php,但不依赖框架。
优点:
- 使用PHP8注解
- 自动生成复杂的Schema
- 类型安全,IDE友好
缺点:
- 文档较少
- 社区规模小
use TheCodingMachine\GraphQLite\Annotations\Query;
class UserController
{
#[Query]
public function user(int $id): User
{
return User::find($id);
}
}
Overblog/GraphQLBundle(Symfony专用)
基于graphql-php的Symfony Bundle。
优点:
- 与Symfony全家桶集成
- 自动生成Schema
- 缓存机制完善
缺点:
- 仅限Symfony
- 配置相对复杂
PHP GraphQL Client(客户端)
如果你的需求是调用GraphQL API(客户端):
use GraphQL\Client;
use GraphQL\Query;
$client = new Client('https://api.example.com/graphql');
$query = new Query('user', ['id' => 1], 'name email');
$result = $client->runQuery($query);
选择建议
| 场景 | 推荐 |
|---|---|
| Laravel项目 | Lighthouse |
| Symfony项目 | Overblog |
| 无框架/微服务 | webonyx |
| 追求代码简洁 | GraphQLite |
| 完全控制 | webonyx |
实战示例(webonyx)
// 定义类型
$userType = new ObjectType([
'name' => 'User',
'fields' => [
'id' => Type::nonNull(Type::id()),
'name' => Type::nonNull(Type::string()),
'email' => Type::string(),
]
]);
// 定义查询
$queryType = new ObjectType([
'name' => 'Query',
'fields' => [
'user' => [
'type' => $userType,
'args' => ['id' => Type::nonNull(Type::id())],
'resolve' => function($root, $args) {
return User::find($args['id']);
}
]
]
]);
// 执行
$schema = new Schema(['query' => $queryType]);
$result = GraphQL::executeQuery($schema, $query, $variables);
echo json_encode($result->toArray());
最推荐 webonyx/graphql-php,它是基石,其他库多数基于它,如果开发Laravel,建议用Lighthouse提升效率。