Traity modelov
Schvaľovania sú polymorfné na oboch stranách. Aktérom, ktorý rozhoduje, môže byť akýkoľvek model — používateľ, tím, servisný účet — a schvaľovaným modelom tiež akýkoľvek — nasadenie, dokument, komentár. Pre každú rolu pridajte príslušný trait:
use Illuminate\Database\Eloquent\Model;
use RoundlyConsulting\Approvals\Traits\GivesApprovals;
use RoundlyConsulting\Approvals\Traits\HasApprovals;
use RoundlyConsulting\Approvals\Traits\RequiresApproval;
class User extends Model
{
use GivesApprovals; // the actor — decides on things
}
class Deployment extends Model
{
use HasApprovals; // the approvable — gets decided on
}
class Release extends Model
{
use HasApprovals;
use RequiresApproval; // a subject that needs multi-approver sign-off
}| Trait | Rozhranie | Pridajte ho na |
|---|---|---|
GivesApprovals | GivesApprovalsInterface | Aktéra, ktorý rozhoduje — používateľa, tím, servisný účet. |
HasApprovals | HasApprovalsInterface | Schvaľovaný model — nasadenie, dokument, komentár. |
RequiresApproval | RequiresApprovalInterface | Subjekt, ktorý potrebuje súhlas viacerých schvaľovateľov cez žiadosť. |
Jeden model môže používať všetky tri — napríklad tím, ktorý schvaľuje prácu iných a zároveň sám potrebuje súhlas. Relácia strany aktéra je givenApprovals() a schvaľovanej strany approvals(), takže sa traity nikdy nebijú.
Strana aktéra — GivesApprovals
$user->approve($deployment, 'LGTM'); // Approval
$user->reject($deployment, 'needs work'); // Approval
$user->cancelApproval($deployment); // ?Approval
$user->toggleApproval($deployment); // bool (simple on/off)
$user->hasApproved($deployment); // bool — holds an approval still in force
$user->hasRejected($deployment); // bool — holds a rejection
$user->approvalFor($deployment); // ?Approval (latest)
$user->givenApprovals; // Collection<Approval> — every decision the user recorded
$user->delegateApprovalsTo($assistant); // ApprovalDelegation — granted at once (see Delegation)
$user->revokeApprovalDelegation(); // int — delegations revoked
$user->approvalDelegations; // delegations this actor handed outhasApproved() a hasRejected() znamenajú „má rozhodnutie s týmto stavom“ — nie iba „existuje riadok“ — a schválenie po uplynutí platnosti sa okamžite prestane počítať.
Schvaľovaná strana — HasApprovals
$deployment->hasBeenApprovedBy($user); // bool
$deployment->hasBeenRejectedBy($user); // bool
$deployment->isApprovedBy($user); // bool — alias of hasBeenApprovedBy()
$deployment->approvalCount(); // int — approvals still in force
$deployment->pendingApprovals(); // Collection<Approval> — asks not yet past their deadline
$deployment->approvals; // Collection<Approval> — every decision on the deploymentSubjekt žiadosti — RequiresApproval
$release->requestApproval([$lead, $qa, $pm]); // ApprovalRequest — Unanimous by default
$release->requestStagedApproval($stages); // ApprovalRequest — list<StageDefinition>
$release->currentApprovalStatus(); // ApprovalStatus — Pending when no request exists, Expired once it is overdue
$release->isApproved(); // bool
$release->isPendingApproval(); // bool
$release->currentStage(); // ?ApprovalRequestStage — the open stage
$release->approvalProgress(); // ?ApprovalProgress
$release->approvalRequests; // every request whose subject is this modelcurrentApprovalStatus(), isApproved(), isPendingApproval(), currentStage() aj approvalProgress() čítajú poslednú žiadosť subjektu. Kým žiadna neexistuje, currentApprovalStatus() vráti Pending a approvalProgress() vráti null; keď otvorenej žiadosti uplynie platnosť, stav ukáže Expired ešte predtým, než ju zaznamená pravidelné vypršanie.
Typujte podľa schopnosti
Každý trait má zodpovedajúce rozhranie v RoundlyConsulting\Approvals\Interfaces — závislosť tak viažete na schopnosť, nie na konkrétny model:
use Illuminate\Database\Eloquent\Model;
use RoundlyConsulting\Approvals\Interfaces\GivesApprovalsInterface;
use RoundlyConsulting\Approvals\Interfaces\HasApprovalsInterface;
use RoundlyConsulting\Approvals\Traits\GivesApprovals;
class User extends Model implements GivesApprovalsInterface
{
use GivesApprovals;
}
function approvalBadge(HasApprovalsInterface $approvable): string
{
return $approvable->approvalCount().' approvals';
}Rozhrania pokrývajú základné rozhodovacie metódy; pomocníci pre delegovanie a stupne sú len na traitoch.
Skratka nad manažérom
Traity sú len skratkou: každá zmena stavu, ktorú urobia — approve(), reject(), requestApproval(), delegateApprovalsTo() a ďalšie — prechádza cez ApprovalsManager, tú istú triedu, ktorá stojí za fasádou Approvals. Approvals::fake() ju preto zaznamená tiež.
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.