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

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ľúčModelTabuľka
modelApprovalapprovals
request_modelApprovalRequestapproval_requests
stage_modelApprovalRequestStageapproval_request_stages
delegation_modelApprovalDelegationapproval_delegations

Tabuľky

TabuľkaStĺpce
approvalsid, 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_requestsid, 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_stagesid, approval_request_id, position, name, rule, quorum, required_approvers, approvers (nullable json), status (predvolene pending), opened_at, cleared_at, timestamps, deleted_at
approval_delegationsid, 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_typeMorph id stĺpecPoužite, keď vaše modely…
bigintbigintpoužívajú predvolené autoinkrementálne kľúče Laravelu (predvolené)
uuiduuidpoužívajú HasUuids
ulidulid (26 znakov)používajú HasUlids
APPROVALS_KEY_TYPE=uuid   # bigint (default), uuid or ulid — set before you migrate

Nenastavená 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 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.