Laravel 10中如何将表单输入值设为全局变量供控制器调用?
解决Laravel中Session存储值刷新后消失的问题
我想把表单的输入值设为全局变量,方便在控制器中调用。尝试用Session::put存储值,但页面刷新后值就消失了。以下是我的表单和控制器代码:
表单代码
<form method="post" action="/dashboard"> @csrf <div class="mb-3"> <label for="outlet" class="form-label">Outlet</label> <select class="form-select" name="outlet_id" id="outlet_id"> @foreach ($outlets as $outlet) <option value="{{ $outlet->id }}">{{ $outlet->name }}</option> @endforeach </select> </div> <button type="submit" class="btn btn-primary col-12">Submit</button> </form>
控制器代码
public function index(Request $request){ $data = $request->outlet_id; Session::put('outlet', $data); Session::get('outlet'); $role = Session::get('role'); $collection = array("blue", "purple", "green", "red"); if($role->role == "admin" || $role->role == "owner"){ return view('dashboard.index', [ 'tittle' => 'Dashboard', 'stocks' => StockGudang::all(), 'products' => Product::all(), 'collection' => $collection ]); }else{ $outlet = Session::get('outlet'); return view('dashboard.index', [ 'tittle' => 'Dashboard', 'stocks' => StockGudang::all()->where('outlet_id', $outlet), 'products' => Product::all(), 'collection' => $collection ]); } }
问题原因及解决方法
1. 核心问题:每次刷新都会覆盖Session值
当前控制器的index方法里,不管是不是表单提交,都会执行Session::put('outlet', $data)。刷新页面时,$request->outlet_id是空值,导致Session里的outlet被覆盖成null,所以刷新后值消失。
2. 修正控制器逻辑
只在表单提交(即存在outlet_id参数)时才更新Session值,修改后的代码如下:
public function index(Request $request){ // 仅当表单提交时更新Session if($request->has('outlet_id')){ Session::put('outlet', $request->outlet_id); } $role = Session::get('role'); $collection = array("blue", "purple", "green", "red"); $outlet = Session::get('outlet'); // 统一获取Session值 if($role->role == "admin" || $role->role == "owner"){ return view('dashboard.index', [ 'title' => 'Dashboard', // 修正原代码的拼写错误:tittle → title 'stocks' => StockGudang::all(), 'products' => Product::all(), 'collection' => $collection ]); }else{ return view('dashboard.index', [ 'title' => 'Dashboard', 'stocks' => StockGudang::where('outlet_id', $outlet)->get(), // 用查询构建器替代集合过滤,性能更优 'products' => Product::all(), 'collection' => $collection ]); } }
3. 检查Session基础配置
- 确认
config/session.php中的driver配置正确,默认是file,需确保storage/framework/sessions目录有读写权限(可执行chmod -R 755 storage/,根据服务器环境调整用户组)。 - 如果使用
database驱动,需先执行php artisan session:table和php artisan migrate生成会话表。
4. 可选:长期存储方案
如果需要让值在用户登录期间持续保留,可将outlet_id存储到用户表的字段中,登录后从用户模型直接获取,避免依赖Session的潜在问题。
内容的提问来源于stack exchange,提问作者eka dita
相关产品推荐
相关产品推荐

