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

Fasáda je odporúčaná voľba, nie jediná cesta. Rovnaký kód spúšťajú tri vstupy: fasáda Sentinel (najkratší zápis); manažér RoundlyConsulting\Sentinel\SentinelManager — koreň fasády, singleton v kontajneri s každou metódou fasády s rovnakou signatúrou — injektovaný cez konštruktor; a akcie v RoundlyConsulting\Sentinel\Actions\…, triedy final readonly s jednou metódou execute().

Injektovanie manažéra

use RoundlyConsulting\Sentinel\SentinelManager;

final class FixInvoice
{
    public function __construct(private SentinelManager $sentinel) {}

    public function __invoke(Invoice $invoice, User $admin): void
    {
        $this->sentinel->for($invoice)->by($admin)->because('Ticket #412: corrected VAT via SQL')->acknowledge();
    }
}

Volanie akcie

Dvadsaťjeden z 28 akcií pre aplikáciu berie jeden verejný objekt požiadavky alebo volieb — vytvárajte ho s pomenovanými argumentmi. Sedem berie obyčajné argumenty: CheckInstallationAction (žiadne), RetireKeyAction($ring, $keyId), ForgetIdempotencyKeyAction($key, $scope), ReadLedgerHistoryAction($model, $seal, $limit), SignRequestAction($request, $keyId, SigningOptions $options), VerifyRequestSignatureAction($request, ?$profile) a VerifyResponseSignatureAction($response, ?$profile). Kým manažér doplní predvolenú pečať modelu sám, AcknowledgeRequest, UnsealRequest a ReadLedgerHistoryAction chcú názov pečate explicitne.

use RoundlyConsulting\Sentinel\Actions\Keys\ImportKeyAction;
use RoundlyConsulting\Sentinel\Actions\Keys\RetireKeyAction;
use RoundlyConsulting\Sentinel\Actions\Seals\AcknowledgeTamperingAction;
use RoundlyConsulting\Sentinel\Actions\Seals\ReadLedgerHistoryAction;
use RoundlyConsulting\Sentinel\Actions\Seals\SealModelAction;
use RoundlyConsulting\Sentinel\DataTransferObjects\AcknowledgeRequest;
use RoundlyConsulting\Sentinel\DataTransferObjects\ImportKeyRequest;
use RoundlyConsulting\Sentinel\DataTransferObjects\SealRequest;
use RoundlyConsulting\Sentinel\Enums\Algorithm;

// The raw actions — a request object…
app(ImportKeyAction::class)->execute(new ImportKeyRequest('http', 'acme-2026-10', Algorithm::Ed25519, $pem, owner: $partner));
app(SealModelAction::class)->execute(new SealRequest($invoice, reason: 'INC-1'));   // null seal = the default one
app(AcknowledgeTamperingAction::class)->execute(new AcknowledgeRequest(
    model: $invoice, seal: 'financial', reason: 'Ticket #412: corrected VAT via SQL', actor: $admin,
));

// …or plain arguments
app(ReadLedgerHistoryAction::class)->execute($invoice, 'financial', 20);   // list<LedgerRecord>, limit 1–1000
app(RetireKeyAction::class)->execute('http', 'acme-2025-10');

Metóda fasády → akcia

Metóda fasádyAkcia (vstup)
check()CheckInstallationAction (no input)
seal()Seals\SealModelAction (SealRequest)
verify()Seals\VerifyModelAction (VerifyRequest)
verifyOrFail()Seals\VerifyModelAction (VerifyRequest)
verifyAll()Seals\VerifyModelsAction (VerifyManyRequest)
verifyMany()Seals\VerifyModelsAction (VerifyManyRequest)
isIntact()Seals\VerifyModelsAction (VerifyManyRequest)
acknowledge()Seals\AcknowledgeTamperingAction (AcknowledgeRequest)
unseal()Seals\UnsealModelAction (UnsealRequest)
ledgerHistory()Seals\ReadLedgerHistoryAction ($model, $seal, $limit)
scan()Seals\ScanSealsAction (ScanOptions)
reseal()Seals\ResealModelsAction (ResealOptions)
resealWhere()Seals\ResealWhereAction (ResealWhereRequest)
updateAndReseal()Seals\UpdateAndResealAction (UpdateAndResealRequest)
sealMissing()Seals\SealMissingAction (BaselineOptions)
generateKey()Keys\GenerateKeyAction (GenerateKeyRequest)
importKey()Keys\ImportKeyAction (ImportKeyRequest)
rotateKey()Keys\RotateKeyAction (RotateKeyRequest)
revokeKey()Keys\RevokeKeyAction (RevokeKeyRequest)
retireKey()Keys\RetireKeyAction ($ring, $keyId)
checkpoint()Ledger\CreateCheckpointAction (CheckpointOptions)
verifyLedger()Ledger\VerifyLedgerAction (LedgerVerifyOptions)
runIdempotent()Idempotency\RunIdempotentAction (IdempotentCall)
forgetIdempotencyKey()Idempotency\ForgetIdempotencyKeyAction ($key, $scope)
issueNonce()Nonces\IssueNonceAction (IssueNonceRequest)
consumeNonce()Nonces\ConsumeNonceAction (ConsumeNonceRequest)
signedRoute()Nonces\IssueSingleUseUrlAction (SignedRouteRequest)
prune()PruneAction (PruneOptions)
signRequest()Signatures\SignRequestAction ($request, $keyId, SigningOptions)
verifyRequestSignature()Signatures\VerifyRequestSignatureAction ($request, $profile)
verifyResponseSignature()Signatures\VerifyResponseSignatureAction ($response, $profile)
  • Každá metóda manažéra, ktorá pečatí, overuje alebo mení stav, si akciu vezme z kontajnera pri každom volaní, takže naviazanie triedy akcie v kontajneri ju nahradí všade — vo fasáde, handloch, traite modelu aj príkazoch. Akcie sú final; náhrada musí ponúknuť rovnakú signatúru execute(), napríklad obal, ktorý loguje a deleguje na pôvodnú akciu.
  • Handly, pod-prístupy, trait modelu, middleware, pravidlo, makrá aj middleware jobov volajú manažéra — nikdy priamo akciu — preto fake vidí každé volanie.
  • Sentinel::fake() (len na fasáde) vymení manažéra vo fasáde aj v kontajneri, takže sa podvrhne aj injektovaný SentinelManager. Priame volanie akcie fake obchádza.
  • Dátové objekty s tajomstvami (ImportKeyRequest, ConsumeNonceRequest, IssuedNonce, GeneratedKey, RotationResult) vypíšu vo var_dump(), json_encode() aj v kontexte logu [redacted] a všetky okrem ConsumeNonceRequest odmietnu serialize().
  • Metódy manažéra ako verifyIn(), persist(), retrieved(), beginIdempotentRequest() či rememberNonce() sú verejné len pre vnútorné zapojenie balíka a označené @internal — nevolajte ich.

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.