Как обрабатывать сообщения об ошибках валидации с дополнительной информацией о строке, в которой эта валидация завершается неудачно? - PullRequest
0 голосов
/ 26 октября 2019

Я использую Laravel-Excel для импорта, и я использую такой же подход, как этот здесь , но я также хочу предоставить дополнительную информацию о том, какая проверка строки не удалась. Это мой метод в контроллере:

public function import(Request $request)
    {
        if ($request->hasFile('file')) {
            $fuelsImport = new FuelsImport();
            $fuelsImport->import($request->file('file'));

            $fuelsValidationErrors = $fuelsImport->getErrors();
        } else {
            $fuelsValidationErrors = [];
        }

        notify()->success(__('smart.SuccessfullyImportMessage'));

        return redirect()->back()->with('validation_errors', $fuelsValidationErrors);
    }

и это мой класс FuelsImport

class FuelsImport implements ToCollection, WithHeadingRow, WithValidation, SkipsOnFailure
{
    use Importable, SkipsFailures;

    private $errors = [];

    public function collection(Collection $rows)
    {
        $rows = $rows->toArray();

        foreach ($rows as $key => $row) {
            if ($row['datum_transakcije']) {
                $dateOfTransaction = Carbon::createFromFormat('d.m.Y H:i:s', $row['datum_transakcije']);

                /** @var Vehicle $vehicle */
                $vehicle = Vehicle::where('registration', $row['nosilac_kartice'])->first();

                if (!$vehicle) {
                    $row['nosilac_kartice'] = -1;
                }
                $authorization = null;

                if ($vehicle) {
                    $authorization = $vehicle->authorizations()->where('start', '<=', $dateOfTransaction)
                        ->where(function ($query) use ($dateOfTransaction) {
                            $query->where('end', '>=', $dateOfTransaction)->orWhereNull('end');
                        })->first();
                }

                if (!$authorization) {
                    $row['datum_transakcije'] = -1;
                }

                $typeOfFuel = TypeOfFuel::where('name', $row['naziv_proizvoda'])->first();

                if (!$typeOfFuel) {
                    $row['naziv_proizvoda'] = -1;
                }

                $validator = Validator::make($row, $this->rules(), $this->validationMessages());

                if ($validator->fails()) {
                    foreach ($validator->errors()->messages() as $messages) {
                        foreach ($messages as $error) {
                            $this->errors[] = $error;
                        }
                    }
                } else {
                    /** @var Fuel $fuel */
                    $fuel = new Fuel();
                    $fuel->account_number = $row['broj_racuna'];
                    $fuel->date = Carbon::parse($dateOfTransaction)->format('d.m.Y');
                    $fuel->type_of_fuel_id = $typeOfFuel->id;
                    $fuel->authorization_id = $authorization->id;
                    $fuel->amount = $row['kol'];
                    $fuel->price = $row['cena'];
                    $fuel->total = $row['total'];
                    $fuel->kilometers_read = $row['kilometraza'];
                    $fuel->vehicle_id = $vehicle->id;
                    $fuel->save();
                }
            }
        }

    }

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

    public function getErrors()
    {
        return $this->errors;
    }

    public function rules(): array
    {
        return [
            'datum_transakcije'     => 'string',
            'nosilac_kartice'       => 'string',
            'naziv_proizvoda'       => 'string',
        ];
    }

    public function validationMessages()
    {
        return [
            'datum_transakcije.string'      => 'Ne postoji autorizacija',
            'nosilac_kartice.string'        => 'Ne postoji vozilo',
            'naziv_proizvoda.string'        => 'Ne postoji tip goriva',
        ];
    }
}

Все отлично работает, и я получаю сообщения в блейд-файле, но я хотел бы предоставить дополнительную информациюо строке, что проверка не пройдена

...