как отслеживать сбои и ошибки при импорте ShouldQueue через API в Laravel

#excel #laravel #api #maatwebsite-excel

#excel #laravel #API #веб-сайт maatwebsite-excel

Вопрос:

С помощью этого процесса я могу загружать данные, содержащиеся в большом файле Excel, если в очереди возникнут какие-либо проблемы с проверкой, он пропустит и загрузит оставшиеся файлы. Но я не знаю, как я могу получить эти ошибки проверки через API. Я использовал if ($import->failures()->isNotEmpty()) способ проверки наличия каких-либо ошибок, которые, как я знаю, не будут работать. Предложите мне лучший способ получить эти ошибки проверки.

На моем ImportController

 public function import(Request $request)
{
    $rules = [
        'file' => 'required|mimes:xlsx,xls',
        'type' => 'filled|string|not_in:null',
    ];
    $validator = Validator::make($request->all(), $rules);
    if ($validator->fails()) {
        $errors = $validator->errors();
        return response()->json($errors, 404);
    }
    
    $type = $request->input('type');
    $file = $request->file;
    $fileName = time() . '--u-' . auth()->user()->id . '.' .$file->extension();
    $location = $file->storeAs('importFile/applicationFile' , $fileName);
    $import = new ApplicationImport;
    $import->import($location);
    if ($import->failures()->isNotEmpty()) {
        return response()->json(['response' => 'Imported! And have some errors!', 'errors' => 
        $import->failures()],  404);                  
    }
    return response()->json(['response' => 'File send to queue! Worker will import it.'],  200);

}
  

В ApplicationImport (используя Maatwebsite Excel)

 namespace AppImports;

use AppModelsApplication;
use MaatwebsiteExcelConcernsToModel;
use MaatwebsiteExcelConcernsImportable;
use IlluminateContractsQueueShouldQueue;
use MaatwebsiteExcelConcernsSkipsFailures;
use MaatwebsiteExcelConcernsSkipsOnFailure;
use MaatwebsiteExcelConcernsWithHeadingRow;
use MaatwebsiteExcelConcernsWithValidation;
use MaatwebsiteExcelConcernsWithBatchInserts;
use MaatwebsiteExcelConcernsWithChunkReading;

class ApplicationImport implements ToModel, WithHeadingRow, WithValidation, WithBatchInserts, WithChunkReading, ShouldQueue, SkipsOnFailure
{
    use Importable, SkipsFailures;

    public function rules(): array
    {
        return [
            '*.title'                   => ['required', 'string', 'max:100', 'unique:applications'],
            '*.user_id'                 => ['required', 'numeric'],
            '*.company_id'              => ['required', 'numeric'],
            '*.course_id'               => ['required', 'numeric'],
            '*.coursetype_id'           => ['required', 'numeric'],
            '*.institution_id'          => ['required', 'numeric'],
            '*.status_id'               => ['required', 'numeric'],
            '*.internal_ref'            => ['required', 'string', 'max:255'],
            '*.external_ref'            => ['required', 'string', 'max:255'],
            '*.intake_month'            => ['required', 'string', 'max:255'],
            '*.intake_year'             => ['required', 'numeric', 'min:4'],
            '*.tution_fee'              => ['required', 'numeric'],
            '*.administration_charge'   => ['required', 'numeric'],
            '*.created_by'              => ['required', 'numeric']
        ];
    }
    
    public function genUID()
    {
        $app_uid = 'USR-' . mt_rand(10000000, 99999999);
        if ($this->uidNumberExists($app_uid)) {
            return $this->genUID();
        } else {
            return $app_uid;
        }
    }
    public function uidNumberExists($app_uid)
    {
        return Application::Where('uid', $app_uid)->exists();
    }
    /**
    * @param array $row
    *
    * @return IlluminateDatabaseEloquentModel|null
    */
    public function model(array $row)
    {
        return new Application([
            'uid' => $this->genUID(),
            'title' => $row['title'],
            'user_id' => $row['user_id'],
            'company_id' => $row['company_id'],
            'course_id' => $row['course_id'],
            'coursetype_id' => $row['coursetype_id'],
            'institution_id' => $row['institution_id'],
            'status_id' => $row['status_id'],
            'internal_ref' => $row['internal_ref'],
            'external_ref' => $row['external_ref'],
            'intake_month' => $row['intake_month'],
            'intake_year' => $row['intake_year'],
            'tution_fee' => $row['tution_fee'],
            'administration_charge' => $row['administration_charge'],
            'created_by' => $row['created_by'],
        ]);
    }
    
    public function batchSize(): int
    {
        return 1000;
    }
    
    public function chunkSize(): int
    {
        return 1000;
    }
}
  

Ответ №1:

Вы должны переместить код вашего контроллера в очередь / задание, где вы можете получать сбои, а затем вы можете получить доступ через Pusher, если вы используете. Если вы не реализуете ShouldQueue при импорте, возможно, вы можете получить сбои.