如何判断当前代码是否处于Laravel HTTP请求上下文?
如何判断当前代码是否处于Laravel的HTTP请求上下文
核心需求
需要准确识别以下场景的HTTP请求上下文,且不能仅通过PHP_SAPI !== 'cli'判断:
- FPM环境下的真实HTTP请求
- 测试过程中,请求调用的执行阶段(测试本身不属于,但请求处理逻辑属于)
- Octane环境下的真实HTTP请求
- PHP内置服务器处理的真实HTTP请求
解决方案
利用Laravel容器中的请求实例类型判断,这是覆盖所有场景的可靠方式:
use Illuminate\Support\Facades\Request; use Illuminate\Http\Request as HttpRequest; function isInHttpRequestContext(): bool { // 先检查容器是否绑定了请求实例 if (!app()->bound('request')) { return false; } // 判断请求实例是否为HTTP请求类型(排除CLI命令的请求实例) return Request::instance() instanceof HttpRequest; }
原理说明
- Laravel在处理HTTP请求时(无论运行环境是FPM、内置服务器、Octane,还是测试中的模拟请求),都会将
Illuminate\Http\Request实例绑定到容器中 - CLI命令、测试用例的外层逻辑中,容器绑定的是
Illuminate\Console\Request或无请求实例,以此区分HTTP上下文 - 该方法完全适配你列出的所有场景,不会因SAPI类型误判
内容的提问来源于stack exchange,提问作者Attila Szeremi
相关产品推荐
相关产品推荐

