Skip to content

arqel-dev/import — Referência de API

Namespace Arqel\Import\. Pipeline de importação CSV/XLSX: columns declarativas, processamento em chunks e transacional, download em CSV das linhas que falharam.

Arqel\Import\Importer (abstract)

Class base que uma aplicação consumidora estende para declarar uma importação.

MétodoTipoDescrição
$modelstatic class-string<Model>Model Eloquent de destino
columns()array<ImportColumn> (abstract)Descritores de column — declare-o
resolveRecord(array $data)ModelResolve o model ao qual uma linha validada corresponde. Default: new $model (insert). Sobrescreva para upsert, por exemplo User::firstOrNew(['email' => $data['email']])
rules()array<string, array>Regras de validação indexadas pelo nome da column, derivadas de columns()

Arqel\Import\ImportColumn (final)

Descritor declarativo de column. Factory: ImportColumn::make($name)$name corresponde ao cabeçalho do arquivo.

MétodoTipoDescrição
label(string)selfLabel de exibição (default = nome)
rules(array)selfRegras de validação do Laravel por linha
fillUsing(Closure)selfTransforma o valor bruto da célula antes da validação
requiredMapping(bool = true)selfMarca o cabeçalho como obrigatório — um cabeçalho ausente aborta o job com um erro de configuração, em vez de silenciosamente deixar todas as linhas nulas
getName() / getLabel() / getRules() / isMappingRequired()getters
applyFill(?string $raw)mixedRoda o fillUsing configurado (ou devolve $raw sem alteração)

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

Casos: CSV, XLSX.

MétodoTipoDescrição
extension()stringValor do enum ('csv', 'xlsx')
fromExtension(string)self (static)Lança InvalidArgumentException para extensões não suportadas

Arqel\Import\Contracts\FileReader (interface)

read(string $source): iterable<int, array<string, string|null>> — faz streaming das linhas de forma lazy, indexadas pelo cabeçalho, nunca carregando o arquivo inteiro na memória. Implementações: Readers\CsvReader, Readers\XlsxReader (ambas baseadas em spatie/simple-excel; o XLSX exige adicionalmente a ext-zip).

Arqel\Import\Contracts\ImportLogger (interface)

Hook de ciclo de vida/progresso.

MétodoDescrição
logQueued(string $importId, ImportFormat $format)Job despachado
progress(string $importId, int $imported, int $skipped)Chamado após cada chunk
logCompleted(string $importId, int $imported, int $skipped, ?string $failedRowsPath)Job finalizado
logFailed(string $importId, ImportFormat $format, Throwable $exception)Job lançou exceção

Binding default: Arqel\Import\Logging\NullImportLogger (no-op), registrado via singletonIf. As aplicações sobrescrevem para persistir uma tabela imports e/ou notificar usuários.

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

Faz streaming do arquivo de origem em chunks de 100 linhas, cada um dentro da sua própria DB::transaction(). Valida cada linha via Validator::make($data, $rules); as linhas que falham são coletadas (com uma column sintética _errors) em vez de abortar o job, e escritas em um CSV baixável ao final.

Parâmetro do construtorTipoDescrição
$importIdstringCorrelaciona as chamadas de progresso/log
$formatImportFormat
$importerClassclass-string<Importer>
$sourcePathstringCaminho absoluto do arquivo enviado
$failedRowsDir?stringDefault storage_path('app/arqel-imports') quando null

handle(ImportLogger $logger): void é o ponto de entrada (o Laravel resolve $logger pelo container). As células do CSV de linhas com falha são sanitizadas contra CSV formula injection (um = + - @ inicial ou caractere de controle recebe um apóstrofo como prefixo).

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

Action de toolbar que abre o fluxo de upload de importação para um Resource. Estender a Action do framework significa herdar a autorização por action em todos os pontos de entrada.

MétodoTipoDescrição
ImportAction::make(string $name)staticFactory. Define o label arqel-import::import.action + o ícone upload
importer(class-string<Importer>)self
format(ImportFormat)selfDefault ImportFormat::CSV
getImporterClass() / getFormat()getters

HTTP

Registrado em routes/admin.php sob web + auth (sem autorização embutida além disso — as aplicações envolvem com o próprio gate):

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

Exemplo

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);

Relacionados

Licença MIT — construído com Inertia + React + Laravel.