DI a akcie
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ády | Akcia (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 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.