Laravel Excel导入问题:如何在UserImport.php中获取Session存储的用户ID
Laravel Excel向Import类传递自定义参数实现数据校验方案
构造函数传参(适用于Session获取user_id场景)
Maatwebsite/Laravel-Excel扩展支持通过Import类的构造函数传入自定义参数,操作步骤如下:
- 修改 UserImport.php,定义类属性接收参数,在需要使用的地方直接调用类属性:
<?php namespace App\Imports; use App\Models\YourTargetTable; use Maatwebsite\Excel\Concerns\ToModel; use Maatwebsite\Excel\Concerns\WithValidation; class UserImport implements ToModel, WithValidation { // 存储传入的用户ID protected $user_id; // 构造方法接收参数 public function __construct(int $user_id) { $this->user_id = $user_id; } public function model(array $row) { // 在此处使用$this->user_id做关联校验 $exits = YourTargetTable::where('user_id', $this->user_id) ->where('unique_field', $row['unique_field']) ->exists(); if ($exits) { throw new \Exception('数据重复'); } return new YourTargetTable([ 'user_id' => $this->user_id, 'field1' => $row['field1'], // 其他字段映射 ]); } // 校验规则内也可直接使用该参数 public function rules(): array { return [ '*.unique_field' => [ 'required', function ($attribute, $value, $fail) { $exits = YourTargetTable::where('user_id', $this->user_id) ->where('unique_field', $value) ->exists(); if ($exits) { $fail($attribute . ' 已存在'); } } ] ]; } }
- 修改 UserController.php,实例化Import类时传入从Session中获取的user_id:
<?php namespace App\Http\Controllers; use App\Imports\UserImport; use Maatwebsite\Excel\Facades\Excel; use Illuminate\Http\Request; use Session; class UserController extends Controller { public function import(Request $request) { $request->validate([ 'excel_file' => 'required|file|mimes:xls,xlsx' ]); $user_id = Session::get('user_id'); // 实例化时传入参数 Excel::import(new UserImport($user_id), $request->file('excel_file')); return back()->with('success', '导入完成'); } }
前端meta标签取值场景处理
如果user_id存储在前端meta标签中,需要在提交导入请求时将参数一并传给后端:
- 前端代码示例:
// 取meta标签值,示例meta标签:<meta name="current_user_id" content="123"> const userId = document.querySelector('meta[name="current_user_id"]').content; // 构造FormData提交 const formData = new FormData(); formData.append('excel_file', uploadFile); formData.append('user_id', userId); // 提交请求到后端接口
- 后端Controller直接取请求参数传入Import即可:
public function import(Request $request) { $user_id = $request->input('user_id'); Excel::import(new UserImport($user_id), $request->file('excel_file')); }
注意事项
- 参数传入前建议做非空和合法性校验,避免异常
- 敏感参数需要做权限校验,防止伪造参数越权访问
内容的提问来源于stack exchange,提问作者TrJoke
相关产品推荐
相关产品推荐

