Modely a schéma
Balík stojí na štyroch modeloch. Každý používa soft deletes, má factory a dá sa vymeniť cez konfiguráciu:
| Konfiguračný kľúč | Model | Tabuľka |
|---|---|---|
model | Approval | approvals |
request_model | ApprovalRequest | approval_requests |
stage_model | ApprovalRequestStage | approval_request_stages |
delegation_model | ApprovalDelegation | approval_delegations |
Tabuľky
| Tabuľka | Stĺpce |
|---|---|
approvals | id, actor (morph), approvable (morph), status (predvolene approved), reason, approval_request (nullable morph), decision_scope, live (nullable), decided_by (nullable morph), weight (predvolene 1), approval_request_stage_id, decided_at, expires_at, timestamps, deleted_at — unikátny index approvals_live_decision_unique |
approval_requests | id, subject (nullable morph), rule, quorum, required_approvers, approvers (nullable json), status (predvolene pending), staged (predvolene false), reject_on_stage_rejection (predvolene true), workflow, resolved_at, expires_at, timestamps, deleted_at |
approval_request_stages | id, approval_request_id, position, name, rule, quorum, required_approvers, approvers (nullable json), status (predvolene pending), opened_at, cleared_at, timestamps, deleted_at |
approval_delegations | id, delegator (morph), delegate (morph), starts_at, ends_at, revoked_at, timestamps, deleted_at |
Stĺpce decision_scope a live zabezpečujú pravidlo jedného živého rozhodnutia na slot: unikátny index pokrýva schvaľovaný model, aktéra, decision_scope (žiadosť a stupeň, pri samostatnom rozhodnutí prázdne) a live, ktorý sa zmení na NULL, keď sa rozhodnutie stiahne, nahradí, vyprší alebo mäkko zmaže. JSON stĺpec approvers uchováva menovaných schvaľovateľov s váhou, ktorú mali pri otvorení — NULL, ak žiadosť či stupeň nikoho nevymenúva.
Relácie a scopes
- Approval — actor(), approvable(), decidedBy() a approvalRequest() (morph-to) a stage() (belongs-to). Scopes: pending(), approved(), rejected(), expired(), active() (čakajúce alebo schválené), live() (živé rozhodnutie každého slotu), inForce(?$moment) a expiringBefore($moment). Metódy: isInForce(?$moment) a wasDelegated().
- ApprovalRequest — subject() (morph-to), decisions() (morph-many) a stages() (has-many, zoradené podľa position). Metódy: namedApprovers(), approversFor(?$stage), hasNamedApprover($model), currentStage(), resolve(), isOverdue(?$moment), lapseIfOverdue(?$moment) a approvalProgress().
- ApprovalRequestStage — request() (belongs-to) a decisions() (has-many). Metódy: namedApprovers(), hasNamedApprover($model), isOpen() a markOpened().
- ApprovalDelegation — delegator() a delegate() (morph-to). Scopes active(?$moment) a inForceOrScheduled(?$moment); metódy isActiveAt(?$moment) a revoke(?$at).
use RoundlyConsulting\Approvals\Models\Approval;
use RoundlyConsulting\Approvals\Models\ApprovalDelegation;
Approval::query()->approved()->inForce()->whereMorphedTo('approvable', $post)->get();
Approval::query()->live()->whereMorphedTo('actor', $user)->get(); // each slot's live decision
Approval::query()->active()->expiringBefore(now())->get();
ApprovalDelegation::query()->active()->whereMorphedTo('delegate', $assistant)->get();
ApprovalDelegation::query()->inForceOrScheduled()->whereMorphedTo('delegator', $manager)->get();Typ morph kľúča
key_type určuje typ siedmich polymorfných id stĺpcov — actor, approvable, approval_request a decided_by v approvals, subject v approval_requests a delegator a delegate v approval_delegations. Všetky morph ciele musia zdieľať jeden typ kľúča:
| key_type | Morph id stĺpec | Použite, keď vaše modely… |
|---|---|---|
bigint | bigint | používajú predvolené autoinkrementálne kľúče Laravelu (predvolené) |
uuid | uuid | používajú HasUuids |
ulid | ulid (26 znakov) | používajú HasUlids |
APPROVALS_KEY_TYPE=uuid # bigint (default), uuid or ulid — set before you migrateNenastavená alebo prázdna hodnota sa číta ako bigint; akákoľvek iná vyhodí pri spustení migrácií InvalidConfigurationException, takže preklep nikdy potichu nevytvorí stĺpce bigint pre modely s UUID či ULID kľúčmi. Vlastné id balíka — vrátane approval_request_stage_id — sú vždy autoinkrementálne.
Výmena modelov
Ktorýkoľvek kľúč modelu nasmerujte na vlastnú podtriedu. Balík nakonfigurovanú triedu použije všade — v akciách, traitoch aj reláciách:
// config/approvals.php
'model' => App\Models\Approval::class,
'request_model' => App\Models\ApprovalRequest::class,
'stage_model' => App\Models\ApprovalRequestStage::class,
'delegation_model' => App\Models\ApprovalDelegation::class,namespace App\Models;
use RoundlyConsulting\Approvals\Models\Approval as BaseApproval;
class Approval extends BaseApproval
{
// your relations, scopes and casts
}Trieda, ktorá nerozširuje očakávaný základný model, vyhodí InvalidApprovalModelException.
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.