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 kryptomienOdoslaní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.