应使用request()->isGet()判断GET请求,因其基于$_SERVER['REQUEST_METHOD']且兼容伪装;不可依赖$_GET是否为空,因HTTP方法与查询参数正交,空$_GET仍可能是GET,非空$_GET也可能是POST。

直接用 request()->isGet(),别碰 $_GET 或 input('xxx') 去反推
为什么不能靠 $_GET 是否为空来判断
常见错误是写 if (!empty($_GET)) { /* 当作 GET */ } —— 这完全不可靠。比如用户直接访问 /user/edit(无查询参数),$_GET 是空数组,但请求类型仍是 GET;又比如 POST 表单里带了 URL 参数(/save?id=123),$_GET 不为空,但实际是 POST 请求。
HTTP 方法和查询参数是正交概念:REQUEST_METHOD 决定请求类型,$_GET 只负责解析 ?a=1&b=2 部分,两者无因果关系。
-
$_SERVER['REQUEST_METHOD'] === 'GET'才是唯一权威依据(ThinkPHP 底层正是读这个) -
request()->isGet()就是它的封装,语义清晰、兼容伪装(如_method=GET) - 不要在控制器里手动
isset($_GET['xxx'])来代替类型判断
request()->isGet() 和 Request::isGet() 用哪个
两者等价,但推荐前者:request() 是助手函数,自动返回当前请求实例,无需 use think\facade\Request;后者需引入命名空间,且在非静态上下文里容易和依赖注入的 $request 混淆。
立即学习“PHP免费学习笔记(深入)”;
- 在控制器方法内直接写
if (request()->isGet()) { ... } - 如果已通过依赖注入拿到
$request(例如public function index(Request $request)),就用$request->isGet() - 避免混用:不要在同一个方法里既调
request()又用Request::isGet()
GET 判断失败的三个典型场景
不是方法写错,而是环境或配置干扰了真实 REQUEST_METHOD:
- 用了 Nginx 的
try_files或重写规则,把 POST 请求错误地转成了内部 GET 转发(查access.log确认原始 method) - 前端用
fetch('/api', { method: 'get' })但服务端被 CDN 或反向代理强制改写了X-HTTP-Method-Override头 - 表单提交时加了
<input name="_method" value="GET">—— ThinkPHP 默认支持伪装,此时isGet()返回 true,但原始请求其实是 POST(需用request()->method(true)查原始值)
真正要区分“用户本意”和“协议层面”,得看你是做权限校验(必须用原始 method),还是做逻辑分支(伪装后的行为更关键)。这点不留意,安全策略就可能漏掉。



















