GraphQL PHP 官方包仅提供解析、校验、执行等核心能力,不包含HTTP服务、路由或自动绑定,需自行集成PSR-7、路由及响应处理;推荐用webonyx/graphql-php搭配nyholm/psr7快速启动,或Laravel项目中使用rebing/graphql-laravel。

Composer 安装 GraphQL PHP 并不是直接执行 composer require graphql/graphql 就能跑起来的——这个包只是参考实现,不带 HTTP 服务、路由或解析器自动绑定,拿来写接口会卡在“怎么接请求”“怎么返回 JSON”上。
GraphQL PHP 官方包(graphql/graphql)到底能干啥
它只提供核心能力:解析 query 字符串、校验 schema、执行 resolver 函数、组装响应。没有内置 Web 框架集成,也不处理 PSR-7 请求/响应、CORS、HTTP 状态码等。
- 适合嵌入已有的 Laravel/Symfony/FastRoute 项目中,作为底层引擎
- 不适合“从零搭个 GraphQL 接口”这种需求——你得自己写路由、读
$_POST['query']、手动调用GraphQL\GraphQL::executeQuery()、拼 JSON 响应 - 常见误操作:装完就访问
/graphql,结果 404 或返回空白——因为根本没注册路由
快速起一个可访问的 GraphQL 接口(推荐方式)
用 webonyx/graphql-php + 轻量 HTTP 层,比如原生 PHP + php -S,或搭配 nyholm/psr7 + guzzlehttp/psr7 做简易服务。
- 运行
composer require webonyx/graphql-php nyholm/psr7 - 创建
server.php,用file_get_contents('php://input')读取 POST body,提取query和variables - 调用
GraphQL\GraphQL::executeQuery()时传入你定义的$schema和$rootValue(resolver 数组) - 手动
header('Content-Type: application/json; charset=utf-8'),然后echo json_encode($result->toArray()) - 启动服务:
php -S localhost:8000 server.php,用 curl 或 GraphiQL 测试
Laravel 项目里怎么安全接入
别手写解析逻辑。用 rebing/graphql-laravel,它自动注册路由、中间件、支持 schema 文件扫描、Eloquent 类型映射。
立即学习“PHP免费学习笔记(深入)”;
- 执行
composer require rebing/graphql-laravel - 发布配置:
php artisan vendor:publish --provider="Rebing\GraphQL\GraphQLServiceProvider" - 在
config/graphql.php中设置'schemas' => ['default' => [...]],指向你的 schema 类 - 定义 schema 类继承
Rebing\GraphQL\Support\Schema,query属性返回 Query 类实例 - Query 类里每个方法对应一个字段,用
type、args、resolve描述;resolver 函数里可以直接 return Eloquent model - 默认路由是
POST /graphql,自带 CSRF 排除和 GraphQL Playground(开发环境)
容易被忽略的三个坑
一是错误没抛出:默认 executeQuery() 失败只返回 errors 字段,不会 throw Exception,前端看到空数据却没报错信息,需检查 $result->errors 并手动 log;二是 N+1 查询:resolver 返回集合时没用 with() 预加载,每个子项触发一次 DB 查询;三是 schema 缓存:开发时改了 type 但没清缓存,导致字段不生效,Laravel 下要 php artisan graphql:clear-cache,原生项目得自己控制 SchemaBuilder::create() 的调用时机。











