DI, akcie a DTO
Balík má tri rovnocenné vstupné body a všetky spúšťajú ten istý kód:
- Fasáda Requests — najkratší zápis a odporúčaná voľba.
- Manažér RoundlyConsulting\Requests\RequestManager — koreň fasády. Injektujte ho cez konštruktor a dostanete rovnaké API ako explicitnú závislosť, bez statických volaní. Každú akciu získava z kontajnera, takže vaše prepisy platia.
- Akcie v RoundlyConsulting\Requests\Actions — jednoúčelové triedy s metódou execute(), ktoré skladáte do vlastných akcií, jobov a príkazov.
Injektovanie manažéra
use RoundlyConsulting\Requests\Models\Request;
use RoundlyConsulting\Requests\RequestManager;
final class SubmitClaim
{
public function __construct(private RequestManager $requests) {}
public function __invoke(User $user): Request
{
return $this->requests->make()->author($user)->title('Expense reimbursement')->create();
}
}Requests::fake() podstrčí podtyp RequestManager za fasádu aj do kontajnera, takže fake dostane aj manažér injektovaný cez konštruktor.
Volanie akcie
CreateRequest prijíma CreateRequestDto a vyvolá RequestCreated:
use RoundlyConsulting\Requests\Actions\CreateRequest;
use RoundlyConsulting\Requests\DataTransferObjects\CreateRequestDto;
use RoundlyConsulting\Requests\Enums\Status;
$request = app(CreateRequest::class)->execute(new CreateRequestDto(
status: Status::New,
author: $user,
title: 'Expense reimbursement',
meta: collect(['ip' => request()->ip()]),
approvers: [$alice, $bob],
expiresAt: now()->addDays(7),
));Metóda fasády → akcia
| Metóda fasády / manažéra | Akcia |
|---|---|
make()->create(), create(CreateRequestDto) | CreateRequest |
approve(), reject(), reopen() | ResolveRequest |
cancel($request) | CancelRequest |
expire($request) | ExpireRequest |
expireDue(bool $dryRun = false, int $chunk = 500) | ExpireDueRequests |
canTransition($request, Status $to) | — (číta graf životného cyklu) |
Priamo volané akcie obídu manažér, preto ich Requests::fake() nezaznamená.
Všetky polia DTO
CreateRequestDto je readonly trieda s pomenovanými argumentmi konštruktora a predvolenými hodnotami:
new CreateRequestDto(
status: Status::New, // Status
author: null, // ?Model
type: null, // ?string
title: null, // ?string
description: null, // ?string
meta: null, // ?Collection
approvers: [], // list<Model> — the declared approvers (saved models)
expiresAt: null, // ?CarbonInterface
rule: ApprovalRule::Unanimous, // ApprovalRule
quorum: null, // ?int
stages: [], // list<StageDefinition> — an ad-hoc pipeline
workflow: null, // ?string — a named preset
stageApprovers: [], // list<list<Model>> — groups for a staged preset
rejectOnStageRejection: true, // bool
);Ktoré schvaľovanie sa otvorí
CreateRequest otvorí najviac jednu schvaľovaciu požiadavku, v tomto poradí priority:
- workflow — pomenovaná predvoľba má prednosť; použije stageApprovers, ak sú zadané, inak approvers.
- stages — explicitné viacstupňové schvaľovanie s ohľadom na rejectOnStageRejection. Jednoduchý zoznam schvaľovateľov zadaný popri stupňoch sa odovzdá tiež, takže engine takúto kombináciu odmietne.
- approvers — jednoduché schvaľovacie kolo so zvoleným pravidlom a kvórom, ktoré týchto schvaľovateľov menovite určí.
- nič — bez deklarovaných schvaľovateľov sa kolo neotvorí a žiadosť uzavrie prvé rozhodnutie.
Schvaľovatelia musia byť uložené modely: samotné id neurčuje typ modelu, takže by sa nedalo vynútiť, a CreateRequest ho v approvers aj stageApprovers odmietne výnimkou InvalidApprover. Žiadosť a jej schvaľovacie kolo sa zapisujú spolu — ak sa kolo nedá otvoriť (neuložený schvaľovateľ, neznáma predvoľba workflowu), žiadna žiadosť nezostane.
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.