不能直接用 $_GET,因其在 Swoole 协程下是进程级全局变量,会导致请求间数据污染;必须通过 RequestInterface 或 Context::get(ServerRequestInterface::class) 安全获取。

控制器里直接用 $_GET 会拿到脏数据
不是框架“不支持”,而是 Swoole 协程下 $_GET 是进程级全局变量,多个请求协程共享同一块内存。A 用户的 $_GET['id'] = 1001 写进去,B 用户紧接着读,大概率拿到 1001——哪怕他根本没传 id。
这种错乱在压测或高并发时立刻暴露,但开发阶段常被忽略,因为单请求跑得通。
- 绝对不要在控制器方法体里写
$_GET['xxx'] - 也不要放在
__construct()或static方法中缓存它 - 中间件、工具函数、Service 类里同理,一律禁用
正确姿势:类型提示 RequestInterface 参数
Hyperf 的 DI 容器会自动从当前协程上下文中取出绑定的唯一 ServerRequestInterface 实例,确保线程安全。
示例:
use Hyperf\HttpServer\Contract\RequestInterface;
class IndexController
{
public function index(RequestInterface $request)
{
$id = $request->get('id'); // GET 参数
$name = $request->input('name'); // 兼容 GET/POST/JSON
$all = $request->getQueryParams(); // 全部 GET 参数数组
return ['id' => $id, 'name' => $name];
}
}
-
$request->get()仅读取 URL 查询参数(?a=1&b=2) -
$request->input()会按顺序查 GET → POST → JSON body,更通用 - 参数名不存在时默认返回
null,可传第二个参数设默认值:$request->get('id', 1)
需要在非控制器方法里获取 GET 参数?显式取上下文
比如你在 UserService 或一个独立工具函数里要读当前请求的 id,不能依赖全局变量,也不能传 $request(破坏解耦),就得手动从协程上下文捞:
use Hyperf\Context\Context;
use Psr\Http\Message\ServerRequestInterface;
function getQueryParam(string $key, $default = null)
{
$request = Context::get(ServerRequestInterface::class);
return $request ? $request->get($key, $default) : $default;
}
- 必须用
Context::get(ServerRequestInterface::class),不是$_GET,也不是ApplicationContext::getContainer()->get(...) - 如果上下文里没有该对象(如 CLI 命令行调用),
Context::get()返回null,记得判空 - 别自己封装
$_GET代理类——容易漏掉协程透传,不如直取 Context
注解路由里带参数?别混用 $_GET 和路径参数
比如路由定义为 Router::get('/user/{id}', ...),这里的 {id} 是路径参数(path parameter),不是 GET 查询参数。它走的是路由匹配提取,不是 $_GET。
获取方式是:
public function show(RequestInterface $request, int $id)
{
// $id 来自路径 /user/123,由框架自动注入
// 不要用 $request->get('id') 去重复取,除非你明确要支持 /user/123?id=456 这种混合场景
}
- 路径参数通过方法参数类型提示自动注入,和
$request并存无冲突 - 若同时存在路径参数和同名 GET 参数(如
/user/123?id=456),$request->get('id')拿到的是 456,不是 123 - 别为了“省事”在注解路由里写
#[GetMapping("/user?id={id}")]——这不符合 REST 规范,且{id}在查询字符串里不会被路由解析
static $cache = $_GET,这种代码上线后查三天都想不到根源在哪。协程隔离不靠自觉,得靠约束和 Code Review。


















