如何在多个Laravel视图传递变量实现更新?求更优解决方案
跨视图传递变量执行UPDATE的简化方案
嘿,针对你在Laravel里需要在editScadenza和elaborazioneScadenza两个视图间传递变量完成UPDATE操作的需求,我整理了几个更简洁优雅的方案,不用重复写查询逻辑或者手动传递ID:
方案1:路由模型绑定+统一数据传递
Laravel的路由模型绑定可以帮你自动获取模型实例,避免手动调用find($id),同时能轻松把模型传递到多个视图:
第一步:定义带模型绑定的路由
// web.php Route::get('/scadenze/edit/{scadenza}', [ScadenzaController::class, 'edit'])->name('scadenze.edit'); Route::get('/scadenze/elaborazione/{scadenza}', [ScadenzaController::class, 'showElaborazione'])->name('scadenze.elaborazione'); Route::put('/scadenze/update/{scadenza}', [ScadenzaController::class, 'update'])->name('scadenze.update');
第二步:修改控制器方法
利用路由模型绑定直接注入Scadenza实例,不用手动查询:
// ScadenzaController.php public function edit(\App\Scadenza $scadenza) { // 直接把模型传给editScadenza视图 return view('scadenze.editScadenza', compact('scadenza')); } public function showElaborazione(\App\Scadenza $scadenza) { // 把同一个模型实例传给elaborazioneScadenza视图 return view('scadenze.elaborazioneScadenza', compact('scadenza')); } public function update(Request $request, \App\Scadenza $scadenza) { $this->validate($request,[ 'titolo'=>'required', 'termine_stimato'=>'required', 'responsabile'=>'required' // 补全你截断的验证规则 ]); // 直接用注入的模型执行更新 $scadenza->update($request->only(['titolo', 'termine_stimato', 'responsabile'])); // 更新完成后重定向到elaborazione视图,自动带上模型 return redirect()->route('scadenze.elaborazione', $scadenza); }
第三步:视图中使用模型
在两个视图里直接使用$scadenza变量即可,比如editScadenza.blade.php:
<form action="{{ route('scadenze.update', $scadenza) }}" method="POST"> @csrf @method('PUT') <input type="text" name="titolo" value="{{ $scadenza->titolo }}"> <!-- 其他表单字段 --> <button type="submit">更新</button> </form> <!-- 跳转到elaborazione视图的链接 --> <a href="{{ route('scadenze.elaborazione', $scadenza) }}">前往处理页面</a>
方案2:隐藏字段传递ID(适合表单流场景)
如果elaborazioneScadenza是在UPDATE操作完成后跳转的页面,也可以通过表单隐藏字段传递ID,然后在对应方法中查询模型:
在editScadenza视图添加隐藏字段
<form action="{{ route('scadenze.update', $scadenzaRecuperata->id) }}" method="POST"> @csrf @method('PUT') <input type="hidden" name="scadenza_id" value="{{ $scadenzaRecuperata->id }}"> <!-- 其他表单字段 --> </form>
修改update方法重定向到elaborazione视图
public function update(Request $request, $id) { $this->validate($request,[ 'titolo'=>'required', 'termine_stimato'=>'required', 'responsabile'=>'required' ]); $scadenza = \App\Scadenza::findOrFail($id); $scadenza->update($request->validated()); // 重定向时带上ID,在elaborazione方法中查询 return redirect()->route('scadenze.elaborazione', $id); } public function showElaborazione($id) { $scadenza = \App\Scadenza::findOrFail($id); return view('scadenze.elaborazioneScadenza', compact('scadenza')); }
方案3:视图共享(适合高频复用场景)
如果这两个视图属于同一组功能,经常需要Scadenza模型,可以在控制器构造方法中共享数据(仅对当前控制器的方法生效):
public function __construct() { $this->middleware(function ($request, $next) { if ($request->route('scadenza')) { $scadenza = \App\Scadenza::findOrFail($request->route('scadenza')); view()->share('scadenza', $scadenza); } return $next($request); }); }
这样在edit和showElaborazione方法中就不用手动传模型到视图了,两个视图直接用$scadenza即可。
内容的提问来源于stack exchange,提问作者Carmine Rub
相关产品推荐
相关产品推荐

