NovinkaZverejnili sme 50+ Laravel balíkov ako open source
Custom AI apps, agents and automation — Roundly ConsultingRoundly
Všetky balíky
Imports for Laravel

Spustenie importu a priebeh

use RoundlyConsulting\Imports\Enums\RecordAction;

$batch = $session->commit();     // BatchHandle
$batch->status(); $batch->progress(); $batch->summary(); $batch->records(RecordAction::Created);
$batch->isRunning(); $batch->isFinished(); $batch->isRolledBack();   // each re-reads the row
$batch->cancel(); $batch->resume();

Ako import prebieha

  • authorize(Commit); relácia musí byť v stave previewed s verziou náhľadu volajúceho a nesmie byť expirovaná (inak 409).
  • Zámok presunie reláciu do stavu committing; riadok ImportBatch zaznamená, kto import spustil.
  • Jeden Laravel job batch s jednou sekvenčnou reťazou úloh pre časti na imports.queue.* (sync pri vypnutom fronte). Veľkosť časti = max(commit.chunk_size, ceil(riadky / commit.max_chunks)), určená pri náhľade. ImportStarted sa spustí tesne pred odoslaním do frontu; ak ho front odmietne, import okamžite zlyhá (dispatch_failed), zámok sa uvoľní a výnimka sa vyhodí ďalej.
  • Každá časť beží v kontexte vlastníka. Prvá časť každého behu sa znova opýta authorize(Commit) pre toho, kto import spustil — používateľ, ktorý stratil prístup, spôsobí zlyhanie dávky (unauthorized).
  • Jedna transakcia na časť. Zamkne riadok dávky a overí, že dávka beží a časť je na rade, takže duplicitné doručenie, opakovanie už zapísanej časti či akákoľvek úloha zastavenej dávky neurobí nič.
  • Neplatné a duplicitné riadky sa preskočia; každý ďalší riadok sa znova overí a spáruje s aktuálnymi dátami (reclassified, ak sa to zmenilo). Každý riadok beží v savepointe: váš callback, potom kontroly — záznam je uložený, na spojení importu a v rámci vlastníka.
  • Vaše zápisy, evidencia, výsledky riadkov a počítadlo častí sa potvrdia alebo vrátia spolu. Približne jeden dopyt na riadok: riadky evidencie sa vkladajú hromadne po častiach, takže vlastné udalosti Eloquentu modelu evidencie sa nespustia — počúvajte ImportChunkProcessed alebo ImportCompleted.
  • Dokončené → completed (ImportCompleted); zlyhané → failed (ImportFailed, dá sa pokračovať). Oboje beží v kontexte vlastníka, nastaví finished_at a undo_until a uvoľní zámok.

Výnimky vo vašich callbackoch

  • ImportRowException a ValidationException nechajú zlyhať riadok so svojou správou.
  • Porušenie unikátneho indexu vo vašej tabuľke nechá riadok zlyhať ako duplicate_created_meanwhile.
  • Akákoľvek iná výnimka nechá riadok zlyhať so všeobecnou správou a nahlási sa.
  • Chyba súbežnosti databázy alebo strateného spojenia a akýkoľvek throwable, ktorý nie je Exception, sa vyhodí ďalej: časť sa vráti a úloha sa zopakuje (commit.tries, commit.backoff, commit.timeout).

Vedľajšie účinky

E-maily, úlohy a súbory, ktoré zapíšu callbacky, sú mimo transakcie. Odosielajte ich až po potvrdení transakcie, aby vrátená časť nikdy nič neposlala:

public function create(ImportRow $row, ImportContext $context): Model
{
    $member = Member::create([...$row->attributes(), ...$context->ownerAttributes()]);

    SendWelcome::dispatch($member)->afterCommit();   // never sent for a chunk that rolls back

    return $member;
}

Zrušenie a pokračovanie

cancel() zastaví reťaz — už zapísané riadky zostanú a dajú sa vrátiť. resume() spustí novú dávku od nasledujúcej časti pre zlyhaný alebo zrušený beh; odmietne sa, keď sú súbor alebo pracovná kópia už zmazané. ImportSummary: created, linked, updated, skipped, failed, reclassified, duplicates, invalid a durationSeconds.

Jeden bežiaci import na vlastníka a importér

Unikátny kľúč zámku na relácii povolí jeden bežiaci import alebo vrátenie na vlastníka a importér; nastaví ho jeden podmienený update, ktorý zároveň zmení stav. Dvojklik na import dostane ImportStateException; iná relácia toho istého vlastníka a importéra dostane ImportAlreadyRunningException (409, s jej uvedením). imports:sweep uvoľní beh bez priebehu počas sessions.stale_after, ktorého job batch je dokončený, zrušený, zlyháva alebo neexistuje, a každý beh bez aktivity počas sessions.abandon_after — beh, ktorý je len pomalý, nechá tak. Beh, ktorého vlastník bol zmazaný, sa stále označí ako zlyhaný a jeho zámok sa uvoľní, no nespustí sa žiadna udalosť — nie je vlastník, ktorého by uviedla. Chyba jednej relácie sa nahlási a sweep pokračuje s ostatnými.

Evidencia: „importované“ pri každom zázname

imported_records obsahuje jeden riadok na každý záznam, ktorý import vytvoril, prepojil alebo aktualizoval — polymorfný pivot „importované z“. Na čítanie pridajte modelu HasImportSource:

use RoundlyConsulting\Imports\Concerns\HasImportSource;

final class Asset extends Model
{
    use HasImportSource;
}

$asset->importRecords;              // MorphMany<ImportedRecord>
$asset->importBatch();              // ?ImportBatch — the latest batch that wrote it whose undo did not remove it
$asset->wasImported();              // bool
Asset::importedIn($batch->model())->get();

Trait len číta. Záznam, ktorý vrátenie ponechalo, sa stále ráta ako importovaný.

Prejavte lásku k open source

Tento balík je zadarmo pod licenciou MIT. Ak vám šetrí čas, jednorazový príspevok alebo členstvo na Patreone nám pomôže ho ďalej udržiavať, testovať a dokumentovať.

Ďalšie spôsoby podpory vrátane kryptomien

Odoslaním daru súhlasíte s našimi podmienkami prijímania darov.

Chcete to zabudovať do svojho produktu?

Naše balíky integrujeme do zákazkových Laravel a AI riešení. Napíšte nám, na čom pracujete, a ozveme sa do 48 hodín.