Delegovanie
Schvaľovateľ môže odovzdať svoju právomoc inému modelu na určité obdobie. Kým delegovanie platí, rozhodnutia zástupcu sa počítajú za delegujúceho — schválenie zaznamená delegujúceho (ako actor) aj zástupcu (ako decided_by):
use Carbon\CarbonImmutable;
use RoundlyConsulting\Approvals\Facades\Approvals;
Approvals::delegations($manager)->to($assistant)->until(CarbonImmutable::now()->addWeek())->grant();
// or ->from($start), ->for($seconds) (measured from the start), or no window at all
$approval = Approvals::for($release)->as($assistant)->approve(); // counts as $manager
$approval->wasDelegated(); // true
$approval->actor; // $manager
$approval->decidedBy; // $assistant
Approvals::for($release)->as($assistant)->cancel(); // the delegate can withdraw what it decided for $managerNastavenie obdobia
Approvals::delegations($delegator)->to($delegate) zbiera obdobie cez from(), until() alebo for(); nič sa nezapíše pred grant(), ktoré uloží ApprovalDelegation a raz spustí ApprovalDelegated už s konečným obdobím. Bez obdobia je delegovanie neobmedzené. delegateApprovalsTo() z traitu udelí delegovanie okamžite:
use Carbon\CarbonImmutable;
use RoundlyConsulting\Approvals\Facades\Approvals;
// A fixed leave window.
Approvals::delegations($manager)->to($assistant)
->from(CarbonImmutable::parse('2026-08-03'))
->until(CarbonImmutable::parse('2026-08-14'))
->grant(); // ApprovalDelegation
// One hour from now.
$delegation = Approvals::delegations($manager)->to($assistant)->for(3600)->grant();
// GivesApprovals shorthand — grants at once and returns the ApprovalDelegation
$manager->delegateApprovalsTo($assistant); // open-ended
$manager->delegateApprovalsTo($assistant, until: CarbonImmutable::now()->addWeek());Zrušenie a prehľad
Approvals::delegations($manager)->revoke(); // revoke all — active and scheduled; returns the count
Approvals::delegations($manager)->revoke($assistant); // revoke one delegate
Approvals::delegations($manager)->active(); // Collection<ApprovalDelegation> in force now, newest first
Approvals::delegationFor($assistant); // ?ApprovalDelegation the assistant acts under now
$manager->revokeApprovalDelegation($assistant); // GivesApprovals shorthand
$manager->approvalDelegations; // every delegation handed out
$delegation->isActiveAt(); // bool — started, not ended, not revoked
$delegation->isActiveAt(CarbonImmutable::parse('2026-08-10'));
$delegation->revoke(); // sets revoked_at on this one modelrevoke() zruší delegovania delegujúceho, ktoré platia alebo sú naplánované na neskôr — alebo len tie na jedného zástupcu — nastaví revoked_at, pri každom zrušení spustí ApprovalDelegationRevoked a vráti ich počet. Delegovaní iného delegujúceho sa nikdy nedotkne. Volanie revoke() na jednom modeli ApprovalDelegation nastaví revoked_at bez spustenia udalosti.
Pravidlá pripísania
- Delegovanie platí, ak nie je zrušené, už začalo (starts_at je prázdne alebo v minulosti) a ešte neskončilo (ends_at je prázdne alebo ešte len príde).
- Pri žiadosti s menovanými schvaľovateľmi smie zástupca rozhodnúť za menovaného delegujúceho a model, ktorý je sám menovaným schvaľovateľom, rozhoduje vždy sám za seba, aj keď zároveň niekoho zastupuje.
- Inde sa každé rozhodnutie zástupcu počíta za delegujúceho; ak platí viac delegovaní, rozhoduje to naposledy vytvorené. Váha sa berie od delegujúceho.
- Autorizačná kontrola overuje konajúceho zástupcu ešte pred prepísaním rozhodnutia na delegujúceho.
- Zástupca môže rozhodnutie, ktoré urobil za delegujúceho, stiahnuť cez cancel() alebo cancelApproval().
- ask() je adresované priamo vyžiadanému modelu, nikdy tomu, koho zastupuje.
Validácia
grant() všetko overí ešte pred zápisom: delegovanie na seba aj obdobie, ktoré končí skôr, než začne, vyhodia InvalidDelegationException a nezostane po nich žiadny riadok:
use Carbon\CarbonImmutable;
use RoundlyConsulting\Approvals\Facades\Approvals;
Approvals::delegations($manager)->to($assistant)
->from(CarbonImmutable::parse('2026-08-14'))
->until(CarbonImmutable::parse('2026-08-03')) // ends before it starts
->grant(); // throws InvalidDelegationException — no row is written
Approvals::delegations($manager)->to($manager)->grant(); // throws InvalidDelegationException — self-delegationPrejavte 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.