Fasáda Approvals
Všetko ide cez jedno API — fasádu Approvals, injektovateľný ApprovalsManager, ktorý za ňou stojí, alebo akcie, ktoré spúšťa. Všetky tri vykonávajú ten istý kód a odporúčaným vstupným bodom je fasáda. Registruje sa automaticky. Celý rozsah:
use RoundlyConsulting\Approvals\Facades\Approvals;
// One actor's decision on one approvable
Approvals::for($deployment)->as($user)->because('Looks good to me')->approve();
Approvals::for($deployment)->as($user)->because('Please add tests')->reject(); // withdraws the approval above
Approvals::for($deployment)->as($user)->ask(); // ask the actor: a pending decision
Approvals::for($deployment)->as($user)->cancel(); // withdraw the actor's live decision
Approvals::for($deployment)->as($user)->toggle(); // simple on/off
Approvals::for($deployment)->as($user)->expiresIn(86400)->approve(); // valid for a day
Approvals::for($deployment)->as($user)->weight(3)->approve(); // override the decision's weight
Approvals::for($invoice)->as($user)->within($request)->approve(); // pin to one request
// Reads
Approvals::for($deployment)->as($user)->isApproved(); // bool
Approvals::for($deployment)->as($user)->isRejected(); // bool
Approvals::for($deployment)->hasPending(); // bool — any pending decision
// Multi-approver requests (flat, staged, or from a workflow preset)
Approvals::request($invoice)->from([$a, $b, $c])->quorum(2)->expiresIn(3600)->open();
Approvals::request($release)->stages([...])->continueOnRejection()->expiringAt($t)->open();
Approvals::request($budget)->workflow('payout')->open([$a, $b, $c]);
Approvals::status($invoice); // ApprovalStatus of the latest request (Pending when none)
Approvals::progress($invoice); // ?ApprovalProgress
Approvals::currentStage($release); // ?ApprovalRequestStage
Approvals::preset('payout'); // WorkflowPreset from config
// Delegation
Approvals::delegations($boss)->to($deputy)->from($monday)->until($friday)->grant();
Approvals::delegations($boss)->revoke($deputy); // or ->revoke() for all; returns int
Approvals::delegations($boss)->active(); // Collection<ApprovalDelegation>
Approvals::delegationFor($deputy); // ?ApprovalDelegation in force now
// Housekeeping
Approvals::expire(); // lapse overdue asks, approvals and requests; returns int
Approvals::expire(subjectType: Invoice::class); // only those on invoices (class or morph alias)Metódy fasády
| Metóda | Vracia | Účel |
|---|---|---|
for($approvable) | PendingApproval | Začne rozhodnutie o schvaľovanom modeli; aktéra nastavíte cez as(). |
as($actor) | PendingApproval | Začne rozhodnutie aktéra; schvaľovaný model nastavíte cez for(). |
request($subject) | PendingApprovalRequest | Otvorí žiadosť pre viacerých schvaľovateľov — jednostupňovú, viacstupňovú alebo zo šablóny. |
status($subject) | ApprovalStatus | Stav poslednej žiadosti subjektu; Pending, ak žiadnu nemá, a Expired, keď otvorenej žiadosti uplynula platnosť. |
progress($subject) | ?ApprovalProgress | Snímka priebehu poslednej žiadosti. |
currentStage($subject) | ?ApprovalRequestStage | Otvorený stupeň poslednej viacstupňovej žiadosti. |
preset($name) | WorkflowPreset | Načíta a overí šablónu z config('approvals.workflows'). |
delegations($delegator) | DelegationsHandle | Udelí, zruší a vypíše delegovania jedného delegujúceho. |
delegationFor($delegate, ?$at) | ?ApprovalDelegation | Delegovanie, v rámci ktorého model koná v čase $at (predvolene teraz). |
expire(?$now, ?$subjectType) | int | Nechá vypršať zmeškané vyžiadania, schválenia a žiadosti a vráti ich počet. S $subjectType (trieda modelu alebo morph alias) len tie na danom type. |
fake() | ApprovalsFake | Vymení manažér za zaznamenávajúci fake; recorded() aj všetky assert*() potom zavoláte aj na fasáde (pozri Testovanie). |
Rozhodnutia — PendingApproval
Začnite od schvaľovaného modelu cez for() alebo od aktéra cez as(), doplňte kontext a zavolajte terminálnu metódu. Žiadosť, ktorá vymenúva schvaľovateľov, každého iného odmietne výnimkou UnauthorizedApprovalException a uzavretá žiadosť odmietne každé rozhodnutie výnimkou ClosedApprovalRequestException:
| Metóda | Vracia | Účel |
|---|---|---|
for($approvable) | self | Nastaví model, o ktorom sa rozhoduje. |
as($actor) | self | Nastaví model, ktorý rozhoduje. |
within($request) | self | Pripojí rozhodnutie k tejto žiadosti namiesto poslednej otvorenej. Musí patriť schvaľovanému modelu (inak InvalidApprovalRequestException) a byť ešte otvorená (inak ClosedApprovalRequestException). |
because($reason) | self | Pripojí dôvod — uloží ho approve(), reject() a cancel(). |
weight($n) | self | Prebije váhu tohto rozhodnutia — pre approve() a reject(). |
expiresIn($seconds) | self | Expirácia o N sekúnd — uplatní ju approve() a ask(). |
expiringAt($at) | self | Absolútna expirácia — uplatní ju approve() a ask(). |
approve() | Approval | Zaznamená schválenie. Započíta sa do pripnutej žiadosti, inak do poslednej otvorenej žiadosti modelu; opakovanie nič nezmení. |
reject() | Approval | Zaznamená zamietnutie — schválenie, ktoré aktér mal, sa stiahne. |
ask() | Approval | Vyžiada od aktéra čakajúce rozhodnutie; ak už živé rozhodnutie má, vráti ho nezmenené. |
cancel() | ?Approval | Stiahne živé rozhodnutie aktéra — alebo to, ktoré urobil ako zástupca — v kole, kam by smerovalo rozhodnutie; null, ak žiadne nie je. |
toggle() | bool | Jednoduchý prepínač — true schválené (cez approve()), false stiahnuté. |
isApproved() | bool | Či má aktér pre daný model schválenie, ktoré ešte platí. |
isRejected() | bool | Či má aktér pre daný model zamietnutie. |
hasPending() | bool | Či má model akékoľvek čakajúce rozhodnutie, ktorému ešte neuplynul termín — stačí for(). |
Žiadosti — PendingApprovalRequest
| Metóda | Vracia | Účel |
|---|---|---|
from([...]) | self | Menovaní schvaľovatelia jednostupňovej žiadosti — rozhodovať môžu len oni (alebo ich zástupcovia). Každý sa uloží raz; required_approvers je predvolene ich počet. |
rule($rule, ?$quorum) | self | Pravidlo a prah jednostupňovej žiadosti — predvolene Unanimous. |
any() / quorum($n) / weighted($n) | self | Skratky pre rule(Any), rule(Quorum, $n) a rule(Weighted, $n). |
stages([StageDefinition, ...]) | self | Zmení žiadosť na viacstupňovú. Spolu s from() vyhodí open() InvalidApprovalRequestException. |
continueOnRejection() | self | Viacstupňová: pokračuje aj po zamietnutom stupni. |
expiresIn($s) / expiringAt($t) | self | Nastaví expires_at na žiadosti. |
open() | ApprovalRequest | Otvorí jednostupňovú alebo viacstupňovú žiadosť; prah, ktorý by schvaľovatelia nikdy nedosiahli, odmietne. |
workflow($name)->open([...]) | ApprovalRequest | Otvorí žiadosť zo šablóny — plochý zoznam alebo jeden zoznam na stupeň. |
Delegovanie — DelegationsHandle
| Metóda | Vracia | Účel |
|---|---|---|
delegations($d)->to($delegate) | PendingDelegation | Začne delegovanie — nič sa nezapíše pred grant(). |
->from($t) / ->until($t) / ->for($seconds) | PendingDelegation | Nastaví obdobie; for() sa počíta od začiatku (bez from() od teraz). |
->grant() | ApprovalDelegation | Overí obdobie, uloží ho a spustí ApprovalDelegated. |
delegations($d)->revoke(?$delegate) | int | Zruší aktívne aj naplánované delegovania tohto delegujúceho — alebo len tie na $delegate. |
delegations($d)->active(?$at) | Collection<ApprovalDelegation> | Delegovania platné v čase $at (teraz), najnovšie prvé. |
Pripnutie k žiadosti, pomocníka approvals(), absolútnu expiráciu a neúplné buildery nájdete v časti Fluentné buildery; to isté API bez fasády v časti DI a akcie.
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.