Laravel同一控制器不同函数间如何传递$newOrder变量到视图打印收据
问题根因
你当前的代码存在两个可能导致变量取不到的场景:
- 你在
token方法中支付完成后直接返回orders.success视图时,没有将$newOrder变量传递给视图 - 如果你后续调整为跳转到
success路由再渲染视图,重定向属于两次独立请求,第一次请求中定义的$newOrder不会自动传递到第二次请求的上下文
如果你之前用compact/with没生效,大概率是你只在success方法里传了变量,但实际支付成功后走的是token方法里的返回视图逻辑,两个方法的上下文不互通,所以不管你在success方法里怎么传变量都不会生效。
解决方案
方案1:直接在token方法返回视图时传参(最简便,适合不需要单独跳转success路由的场景)
找到token方法中支付成功后返回视图的代码,修改为传递变量即可:
// 原来的代码 // return view('orders.success'); // 修改后 return view('orders.success', compact('newOrder'));
这种场景下视图直接就能读取到$newOrder变量,不需要其他改动。
方案2:跳转success路由的场景(适合需要单独暴露success路由的场景)
步骤1:在token方法中重定向时携带订单ID
// 原来的代码 // return view('orders.success'); // 修改为重定向到success路由,携带订单ID参数 return redirect()->route('success', ['order_id' => $newOrder->id]);
步骤2:修改success方法,查询订单后传给视图
public function success(Request $request) { // 读取参数查询订单,找不到直接抛404 $newOrder = Order::findOrFail($request->input('order_id')); return view('orders.success', compact('newOrder')); }
方案3:用session闪存传参(适合不想暴露订单ID在URL的场景)
步骤1:在token方法中闪存订单数据
// 保存订单后、跳转前闪存数据 session()->flash('newOrder', $newOrder); return redirect()->route('success');
步骤2:success方法或者视图直接读取闪存数据
视图中可以直接这么用:
<h1>{{ session('newOrder')->address }}</h1>
或者在success方法里读取后传给视图也可以:
public function success(Request $request) { $newOrder = session('newOrder'); return view('orders.success', compact('newOrder')); }
内容的提问来源于stack exchange,提问作者user15361034
相关产品推荐
相关产品推荐

