在 Laravel 中,上下文(Context) 类似于一种“共享数据空间”,允许你在不同代码层级(如控制器、中间件、服务类)之间传递或共享数据,而无需显式传递参数。
// 在服务提供者中绑定数据
app()->bind('shared.data', function () {
return ['request_id' => uniqid()];
});
// 在控制器中获取
$sharedData = app('shared.data');
// 中间件中设置数据
class SetRequestContext
{
public function handle($request, $next) {
$request->merge(['request_id' => uniqid()]);
return $next($request);
}
}
// 控制器中读取
public function index(Request $request) {
echo $request->input('request_id'); // 输出唯一ID
}
Context
类(Laravel 8+)use Illuminate\Support\Facades\Context;
// 设置上下文数据
Context::set('user.id', auth()->id());
// 获取数据
$userId = Context::get('user.id');
session()
或 cache()
// 设置临时数据(不推荐长期存储)
session()->now('flash_message', '操作成功!');
// 视图直接读取
<div>{{ session('flash_message') }}</div>
中间件生成请求ID:
// app/Http/Middleware/AssignRequestId.php
public function handle($request, $next) {
$requestId = uniqid();
app()->instance('request_id', $requestId); // 绑定到容器
Context::set('request_id', $requestId); // 或使用上下文类
return $next($request);
}
控制器中使用:
public function show() {
$requestId = app('request_id');
Log::info("Controller处理请求ID: $requestId");
}
服务类中调用:
class PaymentService {
public function charge() {
$requestId = Context::get('request_id');
Log::debug("支付服务请求ID: $requestId");
}
}
Context
类确保隔离性。