You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 17:34:53