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

Stavy a strážené prechody

Každá žiadosť je vždy práve v jednom z piatich stavov. Enum poskytuje metódy životného cyklu aj spoločné pomocné metódy pre selecty a validáciu:

$request->status->isOpen();                          // true only for New
$request->status->isTerminal();                      // Approved, Rejected, Cancelled, Expired
$request->status->canTransitionTo(Status::Approved); // bool, per the lifecycle graph
$request->status->allowedTransitions();              // list<Status>

// Shared helpers from enums-for-laravel:
Status::values();
Status::labels();
Status::options();
Status::validationRule();
$request->status->label();

Graf životného cyklu

New        -> Approved | Rejected | Cancelled | Expired
Approved   -> Rejected | New (reopen) | Cancelled
Rejected   -> New (reopen)
Expired    -> New (reopen)
Cancelled  -> (terminal)

Vynútenie prechodov

Nastavte requests.enforce_transitions na true a graf sa začne vynucovať. Nepovolené prechody — napríklad schválenie zamietnutej žiadosti — potom vyhodia InvalidStatusTransition s vlastnosťami $from a $to:

// config/requests.php: 'enforce_transitions' => true

use RoundlyConsulting\Requests\Exceptions\InvalidStatusTransition;

try {
    Requests::approve($rejectedRequest, $alice);
} catch (InvalidStatusTransition $e) {
    $e->from; // Status::Rejected
    $e->to;   // Status::Approved
}
  • approve(), reject(), reopen(), cancel() a expire() pred vykonaním overia graf voči uloženému stavu — pri zapnutom prepínači vyhodí expirácia schválenej žiadosti InvalidStatusTransition, aj keď ide o kópiu načítanú ešte v stave New.
  • Prechod do aktuálneho stavu je vždy povolený.
  • Listener nepovolené rozhodnutie enginu namiesto vyhodenia výnimky preskočí.
  • Pri vypnutom prepínači (predvolené) sa ochrana vynechá a rozhodnutia sa uplatnia priamo — uzavretá žiadosť však zostane uzavretá v každom prípade.

Uzavreté žiadosti

Zrušená alebo expirovaná žiadosť je uzavretá bez ohľadu na enforce_transitions: žiadosť Cancelled je konečná a Expired možno iba znovu otvoriť cez Requests::reopen(). Akákoľvek iná akcia na nej vyhodí RequestAlreadyResolved. Zrušenie už zrušenej či expirácia už expirovanej žiadosti neurobí nič.

Súbežné zmeny

Každý zápis stavu znova načíta riadok žiadosti cez lockForUpdate() v transakcii a kontroly — žiadosť už v danom stave je, je uzavretá, enforce_transitions — vyhodnotí voči uloženému stavu, nikdy nie voči kópii, ktorú držíte. Platí to pre cancel(), expire(), reopen(), approve() / reject() pri žiadosti bez schvaľovateľov, čistenie requests:expire aj listener, ktorý premieta výsledky enginu.

  • Kópia načítaná pred súbežným rozhodnutím, zrušením či čistením neprepíše novší stav — nenechá expirovať schválenú žiadosť a zrušenú neschváli, znovu neotvorí ani nevráti späť.
  • Udalosti vznikajú až po transakcii a len pri skutočnej zmene stavu, takže schválenie, zrušenie a plánované čistenie, ktoré prídu naraz, oznámia každú zmenu práve raz.

Otázka na graf

Prechod si overte ešte pred akciou — napríklad pri rozhodovaní, či zobraziť tlačidlo Schváliť:

use RoundlyConsulting\Requests\Enums\Status;
use RoundlyConsulting\Requests\Facades\Requests;

// Answers the same way whether or not enforcement is on
Requests::canTransition($request, Status::Approved); // bool

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.