Skip to content

arqel-dev/import — Referencia de API

Namespace Arqel\Import\. Pipeline de importación CSV/XLSX: columnas declarativas, procesamiento troceado y transaccional, descarga en CSV de las filas fallidas.

Arqel\Import\Importer (abstract)

Clase base que una app consumidora extiende para declarar una importación.

MétodoTipoDescripción
$modelstatic class-string<Model>Modelo Eloquent de destino
columns()array<ImportColumn> (abstract)Descriptores de columna — declárala
resolveRecord(array $data)ModelResuelve el modelo al que se mapea una fila validada. Por defecto: new $model (inserción). Sobrescríbelo para hacer upsert, p. ej. User::firstOrNew(['email' => $data['email']])
rules()array<string, array>Reglas de validación indexadas por nombre de columna, derivadas de columns()

Arqel\Import\ImportColumn (final)

Descriptor declarativo de columna. Factory: ImportColumn::make($name)$name coincide con la cabecera del archivo.

MétodoTipoDescripción
label(string)selfEtiqueta visible (por defecto = nombre)
rules(array)selfReglas de validación de Laravel aplicadas por fila
fillUsing(Closure)selfTransforma el valor bruto de la celda antes de la validación
requiredMapping(bool = true)selfMarca la cabecera como obligatoria — una cabecera ausente aborta el job con un error de configuración en lugar de dejar silenciosamente en null todas las filas
getName() / getLabel() / getRules() / isMappingRequired()getters
applyFill(?string $raw)mixedEjecuta el fillUsing configurado (o devuelve $raw sin cambios)

Arqel\Import\ImportFormat (enum, respaldado por string)

Casos: CSV, XLSX.

MétodoTipoDescripción
extension()stringValor del enum ('csv', 'xlsx')
fromExtension(string)self (static)Lanza InvalidArgumentException ante extensiones no soportadas

Arqel\Import\Contracts\FileReader (interfaz)

read(string $source): iterable<int, array<string, string|null>> — transmite las filas de forma perezosa, indexadas por cabecera, sin cargar nunca el archivo entero en memoria. Implementaciones: Readers\CsvReader, Readers\XlsxReader (ambas respaldadas por spatie/simple-excel; XLSX requiere además ext-zip).

Arqel\Import\Contracts\ImportLogger (interfaz)

Hook de ciclo de vida y progreso.

MétodoDescripción
logQueued(string $importId, ImportFormat $format)Job despachado
progress(string $importId, int $imported, int $skipped)Se llama después de cada trozo
logCompleted(string $importId, int $imported, int $skipped, ?string $failedRowsPath)Job finalizado
logFailed(string $importId, ImportFormat $format, Throwable $exception)El job lanzó una excepción

Binding por defecto: Arqel\Import\Logging\NullImportLogger (sin operación), vinculado vía singletonIf. Las apps lo sobrescriben para persistir una tabla imports o notificar a los usuarios.

Arqel\Import\Jobs\ProcessImportJob (final, implements ShouldQueue)

Transmite el archivo de origen en trozos de 100 filas, cada uno dentro de su propia DB::transaction(). Valida cada fila mediante Validator::make($data, $rules); las filas fallidas se recopilan (con una columna sintética _errors) en lugar de abortar el job, y se escriben al final en un CSV descargable.

Parámetro del constructorTipoDescripción
$importIdstringCorrelaciona las llamadas de progreso y logging
$formatImportFormat
$importerClassclass-string<Importer>
$sourcePathstringRuta absoluta del archivo subido
$failedRowsDir?stringPor defecto storage_path('app/arqel-imports') cuando es null

handle(ImportLogger $logger): void es el punto de entrada (Laravel resuelve $logger desde el contenedor). Las celdas del CSV de filas fallidas se sanean contra la inyección de fórmulas CSV (un = + - @ inicial o un carácter de control recibe un apóstrofo como prefijo).

Arqel\Import\Actions\ImportAction (final, extends Arqel\Actions\Action)

Action de toolbar que abre el flujo de subida para importar en un Resource. Al extender la Action del framework hereda la autorización por action en todos los puntos de entrada.

MétodoTipoDescripción
ImportAction::make(string $name)staticFactory. Establece la etiqueta arqel-import::import.action y el icono upload
importer(class-string<Importer>)self
format(ImportFormat)selfPor defecto ImportFormat::CSV
getImporterClass() / getFormat()getters

HTTP

Registrado en routes/admin.php bajo web + auth (sin más autorización incluida — las apps lo envuelven con su propio gate):

VerboRutaNombreControlador
POSTadmin/importsarqel.imports.uploadHttp\Controllers\ImportUploadController
GETadmin/imports/{importId}/failed-rowsarqel.imports.failed-rowsHttp\Controllers\FailedRowsDownloadController

Ejemplo

php
use Arqel\Import\Importer;
use Arqel\Import\ImportColumn;
use App\Models\User;

final class UserImporter extends Importer
{
    public static string $model = User::class;

    public function columns(): array
    {
        return [
            ImportColumn::make('name')->rules(['required', 'string', 'max:255']),
            ImportColumn::make('email')
                ->rules(['required', 'email', 'unique:users,email'])
                ->requiredMapping(),
            ImportColumn::make('role')
                ->fillUsing(fn (?string $raw) => strtolower($raw ?? 'member')),
        ];
    }

    public function resolveRecord(array $data): User
    {
        return User::firstOrNew(['email' => $data['email']]);
    }
}
php
use Arqel\Import\Actions\ImportAction;
use Arqel\Import\ImportFormat;

ImportAction::make('import')
    ->importer(UserImporter::class)
    ->format(ImportFormat::CSV);

Relacionado

Licencia MIT — construido con Inertia + React + Laravel.