在 Laravel 控制器中传数据到视图必须用 return view() 直接传数组、with() 链式追加或 compact() 简化键名,重定向需通过 URL 参数再查询后传值。

要在 Laravel 控制器跳转视图时把数据一起传过去,必须在返回视图的那一刻就把变量绑定进去,不能靠重定向后再塞数据——因为重定向会发起全新请求,上一个请求里的变量全部丢失。
用 return view() 直接传数组
这是最基础也最常用的方式,适合一次性传递多个变量。
第一步:在控制器方法里定义好关联数组,键名就是视图中要使用的变量名;
第二步:调用 return view('view.name', $data),Laravel 会自动把数组展开为视图中的独立变量;
例如:return view('user.profile', ['name' => 'Tom', 'email' => 'tom@example.com']); → 在 user/profile.blade.php 中可直接写 {{ $name }} 和 {{ $email }};
【键名必须是合法的 PHP 变量名,不能含点号、中划线或空格】
用 with() 链式追加单个变量
适合已有 view() 调用,但临时想多塞一个值进去,比如从中间件或条件分支动态加参数。
方法一:一次传一个return view('post.index')->with('title', '最新文章'); → 视图中用 {{ $title }};
方法二:连续 with 多次return view('post.index')->with('count', 12)->with('status', 'published'); → 视图中分别用 {{ $count }} 和 {{ $status }};
注意:with() 的第一个参数是字符串变量名,不是控制器里的变量名——别写成 with('count', $count) 就以为能自动推导,它只认你写的字符串。
用 compact() 省掉手写数组键
当你在控制器里已经定义了变量,又不想重复敲键名,compact() 是最省力的选择。
先声明变量:$pageTitle = '用户管理'; $userCount = 42; $isAdmin = true;;
再用 compact 打包:return view('users.list', compact('pageTitle', 'userCount', 'isAdmin'));;
Blade 中直接使用 {{ $pageTitle }}、{{ $userCount }}、{{ $isAdmin }};
这一步操作起来很简单,直接把变量名当字符串传给 compact 就行,但别漏写引号——compact($pageTitle) 是错的,必须是 compact('pageTitle')。
通过 URL 参数跳转并查数据再传(非直传)
如果走的是重定向(比如 redirect()->route()),那控制器无法把变量“带过去”,只能靠 URL 参数间接传递标识,再在目标页面重新查。
第一步:重定向时附带 ID 参数 → return redirect()->route('user.show', ['id' => 123]);;
第二步:目标控制器方法接收该 ID → public function show($id) { $user = User::findOrFail($id); ... };
第三步:查完再用上面任意一种方式(view / with / compact)把 $user 传给视图;
【重定向本身不传业务数据,只传路由参数;真正要渲染的数据必须在目标 action 里重新获取】


















