
本文介绍通过自定义中间件将一次请求中计算出的动态变量(如 $data1)注入到所有后续控制器请求中,实现安全、可维护的跨控制器数据共享。
本文介绍通过自定义中间件将一次请求中计算出的动态变量(如 `$data1`)注入到所有后续控制器请求中,实现安全、可维护的跨控制器数据共享。
在 Laravel 应用中,当业务流程涉及多步表单(例如:第一步选择预约时间/房间,第二步提交消息内容),需将前一步获取的动态查询结果(如匹配的 user_id 列表)传递至后续控制器处理。直接使用全局变量、Session 存储或静态属性不仅违反请求生命周期原则,还易引发并发污染与状态不一致问题。推荐方案是利用 Laravel 的中间件机制,在请求进入控制器前统一注入所需数据。
✅ 正确做法:创建可复用的中间件
首先生成中间件:
php artisan make:middleware CommonData
编辑 app/Http/Middleware/CommonData.php,注意以下关键点:
- ✅ 仅在需要时执行查询:避免无条件执行耗时查询,应通过请求参数存在性判断是否加载 $data1;
- ✅ 使用 request() 辅助函数需谨慎:在中间件中建议使用 $request->input() 替代全局 request(),确保上下文明确;
- ✅ 合理命名与作用域:该中间件应仅应用于关联路由(如 /message/store),而非全局注册。
<?php
namespace App\Http\Middleware;
use Closure;
use Illuminate\Http\Request;
use App\Models\Reservation; // 使用模型类而非字符串调用
class CommonData
{
public function handle(Request $request, Closure $next)
{
// 仅当 date/time/room_id 均存在时才查询,避免空条件误查
if ($request->filled(['date', 'time', 'room_id'])) {
$data1 = Reservation::select('user_id')
->where('date', $request->input('date'))
->where('time', $request->input('time'))
->where('room_id', $request->input('room_id'))
->pluck('user_id') // 返回集合(如 [1, 5, 8]),更符合后续赋值逻辑
->toArray();
// 注入请求实例,供控制器安全访问
$request->merge(['shared_reservation_user_ids' => $data1]);
}
return $next($request);
}
}? 在控制器中使用共享数据
在 SecondController@store 中,无需重复查询,直接从请求中获取:
use Illuminate\Http\Request;
public function store(Request $request)
{
$msg = new \App\Models\Message(); // 显式使用完整命名空间
$msg->date = now(); // Carbon::now() 的简洁写法
$msg->content = $request->input('content');
$msg->user_id = auth()->id();
// ✅ 安全获取共享数据(返回数组,适配多用户场景)
$receiverIds = $request->input('shared_reservation_user_ids', []);
// 若需存入数据库(假设 reciver 是 JSON 字段或关联关系)
$msg->reciver = json_encode($receiverIds); // 示例:存为 JSON 字符串
// 或批量创建关联记录(更规范的做法)
$msg->save();
return redirect()->back()->with('success', '消息已发送');
}⚠️ 重要注意事项
-
不要全局注册此中间件:仅在 routes/web.php 中对目标路由分组应用:
Route::middleware(['common.data'])->group(function () { Route::post('/messages', [SecondController::class, 'store']); }); - 避免 Session 误用:虽然 Session 可临时存储,但 $data1 来源于当前请求参数,其语义属于「本次请求上下文」,不应持久化到 Session,否则可能造成跨请求污染。
- 类型安全提醒:$request->input('shared_reservation_user_ids') 返回 null 或数组,务必做空值检查;若需强制存在,应在验证层(Form Request)提前校验 date/time/room_id。
- 性能优化建议:若查询频繁,可结合缓存(如 Cache::remember())按参数哈希缓存结果,减少数据库压力。
通过该方案,你既保持了 Laravel 的请求驱动架构,又实现了清晰、可控、可测试的数据共享逻辑——这才是 Laravel 风格的最佳实践。


















