直接装 webonyx/graphql-php 不等于 graphql 接口跑起来,需手写入口脚本读取 post json、提取 query/variables、调用 executequery 并返回标准 json 响应,且 resolver 必须严格匹配 schema 类型声明,四个参数顺序不可少,$context 需手动传入,非空字段禁止返回 null。

直接装 webonyx/graphql-php 不等于 GraphQL 接口就跑起来了——它只负责解析 query、执行 resolver、返回结果,不处理路由、不读 POST 数据、不设 header,更不会自动暴露 /graphql 端点。你得自己补全 HTTP 层,否则 curl 一发就是 404 或空白响应。
怎么让 composer require webonyx/graphql-php 真正生效
装完库只是起点,不是终点。常见错误是以为 composer 装完就能访问 /graphql,结果 nginx/Apache 返回 404,或者 PHP 内置服务器返回空页。
- 必须手写一个入口脚本(比如
server.php),用file_get_contents('php://input')读取原始 POST body - 手动解析 JSON,提取
query字段(必填)、variables(可选)、operationName(可选) - 调用
GraphQL\GraphQL::executeQuery()时,第三个参数传入你构造好的$context(比如数据库连接或用户对象),别指望它自动从 $_POST 拿 - 响应前必须加
header('Content-Type: application/json; charset=utf-8'),再echo json_encode($result->toArray())——漏掉errors键(哪怕为空数组),Apollo Client 就会报Response not successful
resolve 函数里拿不到 $args?检查这四个参数顺序
resolver 不是普通闭包,它固定接收四个位置参数:$root、$args、$context、$info。少写一个,PHP 不报错,但 $args 就是空数组。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
-
$args来自 query 中的参数,比如user(id: "123")→$args = ['id' => '123'],类型由 schema 中定义的 input type 决定 -
$context是你传给executeQuery()的第三个参数,不是全局变量,不能在 resolver 里直接读$_SESSION或$_SERVER - 如果 resolver 返回
null,而字段声明为!String(非空字符串),就会触发 “Field 'xxx' expected to return 'yyy' but got NULL” 错误——这不是 PHP Warning,是 GraphQL 执行期类型校验失败 - 对非空字段,别写
return $user->name ?: '',改用return $user->name ?? '',避免 PHP 把0当 false 转成空字符串
Schema 定义容易卡在哪几个地方
新手最常卡在类型拼接和嵌套判空上,不是语法错,而是逻辑没兜住。
- 所有
ObjectType必须显式构造,不能靠文件扫描或注解生成;new Schema(['query' => $queryType])是唯一入口,漏掉query键直接报错 - 嵌套字段如
user { profile { avatar } },如果profileresolver 返回null,整个子树崩,客户端收不到avatar,也收不到错误提示——得在profileresolver 里提前return $user->profile ?: null - 标量类型别混用:schema 声明
Type::int(),resolver 就不能返回"123"(字符串);声明Type::string(),就不能返回null或0 - 要用 SDL(.graphql 文件)代替 PHP 数组定义类型?得额外装
webonyx/graphql-php-tools,原生库不支持
真正麻烦的从来不是装库,而是 resolver 返回值和 schema 类型声明之间那层脆弱的一致性——它不报 PHP 错,却让前端查不到数据,还很难定位。每次改字段类型,都得同步扫一遍所有 resolver 的返回路径。










