es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Detectar un error al importar un gran archivo CSV en una cola utilizando Laravel Excel.

Estoy utilizando el método “ShouldQueue” para poner el gran CSV en una cola, pero ¡no puedo capturar los errores de validación!

public function registerEvents(): array
{
    return [
        ImportFailed::class => function(ImportFailed $event) {
            dd($event); // Esto lo escribiré en el archivo o enviaré por correo electrónico, pero el trabajo se ejecuta correctamente pero los errores de validación siguen vacíos.
            $this->importedBy->notify(new ImportHasFailedNotification);
        },
    ];
}

Mi código se ve así:

public function registerEvents(): array
{
    return [
        ImportFailed::class => function(ImportFailed $event) {
            $filename = public_path('tmp/validation_error.txt');
            $myfile = fopen($filename, "w");
            fwrite($myfile, "domo");
            fclose($myfile);
        },
    ];
}

Espero que si hay algún error, el archivo “validation_error.txt” tenga “Demo” dentro de él.

Además, he verificado eliminando “ShouldQueue” y me muestra los errores correctamente, como “el correo electrónico ya existe”.

¡Por favor, ayúdame si tienes alguna idea! ¡Gracias!

Tags:  ,

Answer

  1. Avatar for davy.ai

    Parece que el problema está relacionado con el uso de la interfaz ShouldQueue en combinación con los listeners de eventos para los errores de validación en un proceso de importación de Laravel-Excel. Una posible solución para capturar los errores de validación en este escenario es utilizar una clase Job separada para el proceso de importación y definir el método failed para manejar cualquier error de validación.

    Aquí hay un ejemplo de fragmento de código para la clase ImportJob que incluye el método failed para capturar cualquier error de validación:

    use App\Imports\MyImport;
    use Maatwebsite\Excel\Concerns\WithEvents;
    use Maatwebsite\Excel\Events\ImportFailed;
    
    class ImportJob implements ShouldQueue, WithEvents
    {
        use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
    
        private $file;
    
        public function __construct($file)
        {
            $this->file = $file;
        }
    
        public function handle()
        {
            $import = new MyImport();
            Excel::import($import, $this->file);
        }
    
        public function registerEvents(): array
        {
            return [
                ImportFailed::class => function (ImportFailed $event) {
                    Log::error('Importación fallida: ' . $event->getException()->getMessage());
                },
            ];
        }
    
        public function failed(\Throwable $exception)
        {
            Log::error('Importación fallida: ' . $exception->getMessage());
            // manejar errores de validación aquí si es necesario
        }
    }
    

    Ten en cuenta que el listener de eventos ImportFailed registra el mensaje de error en el archivo de registro de Laravel, y el método failed también registra el mensaje de error y se puede utilizar para manejar errores de validación.

    Para usar esta clase ImportJob, puedes despachar una nueva instancia desde tu controlador u otro código:

    use App\Jobs\ImportJob;
    
    $file = $request->file('csv');
    ImportJob::dispatch($file);
    

    Esto encolará el trabajo de importación y comenzará el proceso de importación. Si ocurren errores de validación, se registrarán y / o se manejarán en el método failed de la clase ImportJob.

Comments are closed.