我已经实现了求职媒体的管理网站。 然后我想逐一验证导入的 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 类中做同样的事情? 因为如果我可以在那里进行验证,我就不需要在控制器中进行处理,这是更好的代码。
Maatwebsite\Excel 提出了验证流程,您可以在不同的文件中为您使用的每种导入类型进行配置。你应该去那里:文档链接