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

Hromadné operácie

Sentinel::model(Invoice::class) vráti handle ModelSeals, ktorý pracuje so všetkými riadkami modelu. Dopyt nad inou triedou modelu sa odmietne (SealingMisconfiguredException::queryModelMismatch).

$seals = Sentinel::model(Invoice::class);

$seals->scan();                                     // ScanReport: counts per status + findings
$seals->scan(where: fn ($query) => $query->where('tenant_id', 7));   // only these rows, chunked
$seals->scan(progress: fn (int $rows) => $bar->setProgress($rows));  // after every chunk
$seals->sealMissing(reason: 'Initial baseline');    // adopt rows that were never sealed
$seals->reseal();                                   // re-seal intact rows with the current key
$seals->reseal(acknowledgeReason: 'INC-90');        // …and acknowledge the others
$seals->resealWhere(fn ($query) => $query->where('status', 'draft'), reason: 'INC-91', actor: $admin);
$seals->updateAndReseal(
    fn ($query) => $query->where('status', 'draft'), ['currency' => 'EUR'], reason: 'FIN-12 currency migration', actor: $admin,
);
$seals->unsealedQuery()->count();                   // rows without a seal row
$seals->seals();                                    // ['financial', 'identity']

Ploché tvary

Ploché tvary berú objekty volieb, ktoré nesú aj to, čo handle nemá — checkSchema pri skene a upgradeFormat pri prepečatení:

use RoundlyConsulting\Sentinel\DataTransferObjects\BaselineOptions;
use RoundlyConsulting\Sentinel\DataTransferObjects\ResealOptions;
use RoundlyConsulting\Sentinel\DataTransferObjects\ResealWhereRequest;
use RoundlyConsulting\Sentinel\DataTransferObjects\ScanOptions;
use RoundlyConsulting\Sentinel\DataTransferObjects\UpdateAndResealRequest;

Sentinel::scan(new ScanOptions([Invoice::class], seal: 'financial', limit: 10_000, checkSchema: true));
Sentinel::reseal(new ResealOptions(Invoice::class, onlyOutdated: true));
Sentinel::reseal(new ResealOptions(Invoice::class, upgradeFormat: true));   // rows of an older canonical format
Sentinel::resealWhere(new ResealWhereRequest(Invoice::class, fn ($query) => $query->where('tenant_id', 7), 'INC-91', $admin));
Sentinel::updateAndReseal(new UpdateAndResealRequest(Invoice::class, fn ($query) => $query->where('status', 'draft'), ['currency' => 'EUR'], 'FIN-12', $admin));
Sentinel::sealMissing(new BaselineOptions(Invoice::class, null, 'Initial baseline'));

Prepečatenie nikdy nelegalizuje zmenu

reseal() (aj sentinel:reseal) každý riadok znovu overí pod jeho zámkom a prepečatí len riadky Intact alebo Outdated (udalosť rotated). Riadky už zapečatené aktuálnym kľúčom podľa aktuálnej definície ostanú bez zmeny. Každý iný stav sa preskočí a nahlási — pokiaľ nezadáte dôvod potvrdenia; vtedy sa každý potvrdí so zaznamenaným dôvodom a aktérom. Riadok, ktorý sa nedá zapečatiť, sa započíta ako failed; zamietnutie politikou potvrdenia beh zastaví. ResealReport má resealed, acknowledged, skipped, failed, skippedResults (najviac 1 000) a dryRun.

Zámerné hromadné aktualizácie

updateAndReseal() najprv v prechode len na čítanie overí každý vybraný riadok — akýkoľvek riadok, ktorý nie je neporušený, vyhodí TamperedModelException::many() a nič sa nezapíše. Potom pre každú dávku (predvolene 500) v jednej transakcii riadky zamkne, pod zámkom ich znovu overí (riadok zmenený medzitým dávku stále odmietne, medzitým zmazaný sa preskočí), spustí update($values) query buildera a každý riadok prepečatí s dôvodom.

Baseline

sealMissing() (aj sentinel:seal-missing --reason=…) zapečatí riadky bez riadku pečate a bez histórie v denníku (udalosť baseline, dôvod je povinný). Riadky s históriou, no bez riadku pečate, sa nahlásia ako seal_deleted a baseline nikdy nedostanú — zmazaná pečať je dôkaz.

where pri skene je closure, ktorá dostane dopyt modelu (bez globálnych scopes, rovnako ako pri celej tabuľke), alebo builder daného modelu; len filtruje, nikdy nemení poradie. reseal() a sealMissing() berú aj callback progress a dlhé príkazy v termináli zobrazia indikátor priebehu.

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.