有没有办法验证表单请求中导入的 CSV 的每一行?

问题描述 投票:0回答:1

背景

我已经实现了求职媒体的管理网站。 然后我想逐一验证导入的 CSV 行,所以我实现如下。

查看

<div id="main">
        <h1 id="page_title">求人票一覧</h1>
        @if ($errors->get('upload_errors'))
            @foreach ($errors->get('upload_errors') as $error)
                <li class="error_text" style="color: #f44336;">{{ $error }}</li>
            @endforeach
        @endif
</div>

控制器

use App\Imports\JobsImport;
use Illuminate\Http\Request;
use Maatwebsite\Excel\Facades\Excel;

class JobsController extends \App\Http\Controllers\Controller
{
  public function __construct(
          JobService $jobService,
      ) {
          $this->jobService = $jobService;
      }

  public function import(Request $request)
      {
          $csv = $request->file("csv");
          $csvArray = Excel::toArray(new JobsImport, $csv);
          $errors = $this->jobService->validateCsv($csvArray[0]);

          if (!is_null($errors)) {
              session()->flash("errors", $errors);
              return redirect("admin/job");
          }
          ImportCsvJobs::dispatch($csv);
          return redirect("admin/job");
      }
}

就业服务

namespace App\Services\Admin;

use Illuminate\Support\Facades\Validator;
use Illuminate\Support\MessageBag;
use Illuminate\Support\ViewErrorBag;
use Exception;

class JobService
{
    public function validateCsv(array $csvArray)
    {
        $rules = [
            "求人ID" => [
                "required",
                "integer"
            ],
            "求人名" => [
                "required",
            ],
            "企業名" => [
                "required",
            ],
            "園名" => [
                "required",
            ],
            "担当者名" => [
                "required",
            ],
            "雇用形態" => [
                "required",
            ],
            "職種" => [
                "required",
            ],
            "おすすめポイント1" => [
                "required",
            ],
            "おすすめポイント2" => [
                "required",
            ],
            "こんな方におすすめ1" => [
                "required",
            ],
            "こんな方におすすめ2" => [
                "required",
            ],
            "求める人物像" => [
                "required",
            ],
            "応募資格" => [
                "required",
            ],
            "給与形態" => [
                "required",
            ],
            "最低給与額" => [
                "required",
            ],
            "最高給与額" => [
                "required",
            ],
            "給与・待遇" => [
                "required",
            ],
            "勤務時間" => [
                "required",
            ],
            "固定時間勤務" => [
                "required",
            ],
            "休日" => [
                "required",
            ],
            "福利厚生" => [
                "required",
            ],
            "交通費" => [
                "required",
            ],
        ];

        $attributes = [
            "求人ID" => "ID", // job posting ID
        ];
        $uploadErrorList = [];
        foreach ($csvArray as $key => $value) {
            if (!is_array($value)) continue;
            $validator = Validator::make($value, $rules, $attributes);
            if ($validator->fails()) {
                $errorMessage = array_map(fn ($message) => $key + 1 . "行目: " . $message, $validator->errors()->all());
                $uploadErrorList = array_merge($uploadErrorList, $errorMessage);
            }
        };
        if (empty($errorMessage)) return null;

        $errors = new ViewErrorBag();
        $messages = new MessageBag(["upload_errors" => $uploadErrorList]);
        $errors->put("default", $messages);
        return $errors;
    }
}

问题

有没有办法在 FormRequest 而不是 Service 类中做同样的事情? 因为如果我可以在那里进行验证,我就不需要在控制器中进行处理,这是更好的代码。

php excel laravel validation
1个回答
1
投票

Maatwebsite\Excel 提出了验证流程,您可以在不同的文件中为您使用的每种导入类型进行配置。你应该去那里:文档链接

© www.soinside.com 2019 - 2024. All rights reserved.