Laravel Excel 导入验证未给出结果

laravel excel import validation not giving the result

提问人:owf 提问时间:10/1/2023 更新时间:10/3/2023 访问量:114

问:

我尝试按照这个 laravel excel 文档在 Laravel Excel 的导入类中使用 Validator 来验证 excel 行,但似乎验证结果没有给出结果

控制器:(顺便说一句,我正在使用带电线)

public function save()

{
    $this->validate();
    
    try {
        $import = new OutputImport();
        $import->import($this->excel);
    } catch (\Maatwebsite\Excel\Validators\ValidationException $e) {
        $failures = $e->failures();

        dd($failures);
    }
}

Import 类:

class OutputImport implements ToCollection, WithStartRow, SkipsEmptyRows
{
    use Importable;

    protected $outputs;
    protected $outputIds;

    public function __construct()
    {
        $this->outputs = Output::where('status',1)->get();
        $this->outputIds = $this->outputs->pluck('id')->toArray();
    }

    public function collection(Collection $rows)
    {
        Validator::make($rows->toArray(), [
            '*.0' => ['required', function(string $attribute, mixed $value, Closure $fail) {
                if (!in_array($value, $this->outputIds))
                    $fail('Periksa dan pastikan kembali ID yang diinput.');     
            }],
            '*.5' => 'required',
            '*.6' => 'required|min:0',
            '*.7' => 'required|min:0',
        ])->validate();
    }

    public function startRow(): int
    {
        return 2;
    }
}

excel数据在那里,但是在验证执行后,它根本没有给我任何响应 如何获得验证结果?

PHP Laravel 验证 laravel-excel

评论

0赞 Herrys Aghista Rachman 10/1/2023
不要忘记添加use Maatwebsite\Excel\Validators\Failure;
0赞 kris gjika 10/2/2023
我建议再次阅读文档:docs.laravel-excel.com/3.1/imports/...。在文档中,没有创建手动验证程序实例的位置
0赞 owf 10/2/2023
@HerrysAghistaRachman我认为这不是一个特征,所以不可能在类前面添加“use”,如果你指的是命名空间,我已经添加了它
0赞 owf 10/2/2023
@krisgjika我参考了这个文档 docs.laravel-excel.com/3.1/imports/... “没有 ToModel 的行验证”部分,它说我们可以使用 Validator 实例
0赞 kris gjika 10/2/2023
如果单行未通过验证,@owf希望导入失败?还是只想导入有效行?

答:

1赞 kris gjika 10/3/2023 #1

通过以下方式创建一个验证器实例并手动验证而不会引发异常:

$validator = \Illuminate\Support\Facades\Validator::make($rows->toArray(), $rules);
        
if ($validator->fails()) {
  // save messages wherever to access them later from your controller  
  $messages = $validator->errors();
} else {
  // handle your import ...
}

但是,您无法真正从导入中“返回”这些错误,尤其是在导入排队时。我建议将这些错误存储在表格中,或者根据您打算存储它们的时间进行缓存,并将它们显示给用户。您可以创建一个导入模型来跟踪您的导入(如果执行很多操作),其中包含状态和错误等字段。

评论

0赞 owf 10/5/2023
咕,谢谢,它有效!