Laravel中如何通过重定向路由向视图传递所需变量?
解决Laravel认证后重定向传递视图变量的问题
你遇到的核心问题是重定向属于跨请求操作,而compact()是在当前请求内把变量传递给视图,所以没法直接用在重定向场景里。要把数据传递到重定向后的视图,最常用的方案是利用Session的闪存功能,或者调整路由逻辑让目标控制器来处理数据传递。下面给你具体的实现方法:
方法一:使用Session闪存数据(推荐)
Session闪存数据会自动在下一次请求后清除,非常适合这种一次性的重定向数据传递场景。你可以修改authenticated方法,把需要传递的数据闪存到Session中,然后在目标视图或控制器中取出:
第一步:修改authenticated方法
protected function authenticated(Request $request, $user) { // 优化查询:直接用当前已认证的$user对象,无需重复查询数据库 $activated_up = $user->activated_up; $showuser = UserProfile::where('id_user', $user->id_user)->first(); // 将数据闪存到Session,并重定向到目标路由 return redirect()->route('set_password') ->with([ 'activated_up' => $activated_up, 'showuser' => $showuser ]); }
第二步:在目标视图中使用数据
你可以直接在set_password.blade.php中通过Session获取数据:
<!-- 获取activated_up的值 --> <p>激活状态:{{ session('activated_up') }}</p> <!-- 获取showuser的字段值 --> <p>用户名:{{ session('showuser')->username }}</p>
或者你也可以在目标路由对应的控制器方法中先取出Session数据,再传递给视图(更规范):
public function showSetPasswordPage() { // 从Session取出数据 $activated_up = session('activated_up'); $showuser = session('showuser'); // 传递给视图 return view('set_password', compact('activated_up', 'showuser')); }
方法二:重定向到控制器方法(替代方案)
如果不想用Session,你可以把set_password路由指向一个控制器方法,在该方法中直接查询所需数据(不过你已经在authenticated里查过了,所以第一种方法更高效):
1. 修改路由定义
// 原来的路由(直接指向视图) // Route::get('/set-password', function () { return view('set_password'); })->name('set_password'); // 修改为指向控制器方法 Route::get('/set-password', [UserController::class, 'showSetPassword'])->name('set_password');
2. 在控制器方法中查询并传递数据
public function showSetPassword() { $user = Auth::user(); $activated_up = $user->activated_up; $showuser = UserProfile::where('id_user', $user->id_user)->first(); return view('set_password', compact('activated_up', 'showuser')); }
额外优化建议
你原来的User::where('id_user',Auth::user()->id_user)查询完全是多余的——因为authenticated方法的第二个参数$user就是当前已认证的用户对象,直接调用$user->activated_up就能拿到对应字段,不用再发起一次数据库查询,能提升性能。
内容的提问来源于stack exchange,提问作者Parth Pandya
相关产品推荐
相关产品推荐

