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

Fasáda Workflows

Všetko ide cez jednu fasádu, RoundlyConsulting\Workflows\Facades\Workflows (globálny alias Workflows), ktorá je nadstavbou nad singletonom WorkflowsManager v kontajneri. Manažér nedrží žiadny stav požiadavky, takže je bezpečný pre Octane. Každá metóda, ktorá niečo mení, má návratový typ, ktorý nie je null:

use RoundlyConsulting\Workflows\Facades\Workflows;

// Start and emit
Workflows::start('purchase-approval', $request, $team)->input([...])->by($user)->idempotencyKey($key)->dispatch();
Workflows::emit('purchase_request.submitted', $request, ['amount' => '1200'], idempotencyKey: "sub:{$request->id}", user: $user);
Workflows::for($request)->start('purchase-approval')->dispatch();   // the subject owner's definition, else the app-wide one

// Definitions and versions
Workflows::definitions()->create(key: 'purchase-approval', name: 'Purchase approval', subjectType: 'purchase_request', owner: $team);
Workflows::definition('purchase-approval', $team)->edit($graph);   // save the draft — see the definition handle
Workflows::definition('purchase-approval', $team)->publish(by: $admin);
Workflows::versions()->diff($v2, $v3);
Workflows::versions()->export($version);

// Runs
Workflows::instances()->find($ulid);
Workflows::instances()->retry($instance);
Workflows::instances()->cancel($instance, 'withdrawn');

// Registries a builder reads
Workflows::catalogue()->export();               // every step type with its config schema and outcomes
Workflows::subjects()->export('purchase_request');
Workflows::calendars()->names();
Workflows::triggers()->events();
Workflows::schema()->graph();                    // the graph JSON Schema

// The graph builder, wake and prune
Workflows::graph()->trigger('start', Trigger::manual())->end('done')->chain('start', 'done');
Workflows::wake();                               // what workflows:wake runs
Workflows::prune();                              // what workflows:prune runs

Metódy manažéra

MetódaVraciaČo robí
start(string $key, ?Model $subject = null, ?Model $owner = null)PendingStartRučné spustenie; ->dispatch() spustí StartInstanceAction.
startWith(StartData $data)StartResultTo isté z DTO.
emit(string $event, ?Model $subject = null, array $payload = [], ?string $idempotencyKey = null, ?Model $user = null, ?Model $owner = null)EmitResultSpustí každú zodpovedajúcu aktívnu definíciu a signalizuje čakajúcim krokom; definícia, ktorá sa odmietne spustiť, sa uvedie vo failed.
emitWith(EmitData $data)EmitResultTo isté z DTO.
for(Model $subject)SubjectHandleSpustenie, emit, história, zrušenie a touch pre jeden subjekt.
definition(string $key, ?Model $owner = null)DefinitionHandleJedna definícia jedného vlastníka (null = celá aplikácia).
definitions()DefinitionsAccessorcreate, createWith, find, exists, all, sync, restore.
versions()VersionsAccessorvalidate, diff, overlay, export, import, dryRun.
instances()InstancesAccessorfind, recent, detail, steps, retry, cancel.
catalogue()CatalogueAccessorregister, all, find, has, export — typy krokov.
subjects()SubjectsAccessorregister, find, export, all — typy subjektov.
subject(string $key, string $model)SubjectTypeBuilderOpis typu subjektu na registráciu.
calendars()CalendarsAccessorregister, find, names — pracovné kalendáre.
triggers()TriggersAccessorwebhook, map, listen, events.
schema()SchemaAccessorgraph, template, definitions — JSON Schemas.
graph()GraphBuilderPlynulý zostavovač grafu; čistý, fake ho prepúšťa.
wake(?CarbonInterface $now = null)WakeReportJeden prechod prebúdzania (WakeAction); celý prechod beží v čase $now.
prune()PruneReportZmaže dáta po uplynutí doby uchovania (PruneAction).

signal(), perform() a make() sú na manažérovi verejné, no interné — slúžia prepojeniam a handlom. Z kódu aplikácie ich nevolajte.

Workflows::definition($key, $owner)

Jedna definícia jedného vlastníka (null = celá aplikácia); kľúč iného vlastníka sa nikdy nenájde. Každá metóda, ktorá potrebuje riadok, vyhodí UnknownDefinitionException (404), ak chýba:

$handle = Workflows::definition('purchase-approval', $team);

$handle->model();                         // WorkflowDefinition (UnknownDefinitionException if missing)
$handle->draft();                         // the draft version or null
$handle->edit($graph, $expectedChecksum); // save the draft (a graph array or a GraphBuilder; created as a copy of the current version)
$handle->discardDraft();
$handle->validate();                      // ValidationReport of the draft
$handle->publish(by: $admin);             // the draft becomes the current version
$handle->retire();                        // no new starts; running instances finish
$handle->activate();                      // allow starts again
$handle->resolveFlag($node, $path);       // dismiss a template review flag
$handle->rotateWebhook();                 // a new webhook id
$handle->versions();                      // every version, by number
$handle->version(3);
$handle->instances(InstanceStatus::Failed, perPage: 25);   // cursor-paginated history
$handle->start($subject);                 // PendingStart
$handle->dryRun(?int $version);           // PendingDryRun (NoVersionException for a missing version)
$handle->export(?int $version);           // TemplatePayload (NoVersionException for a missing version)
MetódaVraciaČo robí
model()WorkflowDefinitionRiadok; ak chýba, UnknownDefinitionException (404).
draft()?WorkflowVersionKoncept alebo null.
edit(array|GraphBuilder $graph, ?string $expectedChecksum = null)WorkflowVersionUloží koncept; zastaraný kontrolný súčet vyhodí DraftConflictException.
discardDraft()WorkflowDefinitionZahodí koncept.
validate()ValidationReportÚplná validácia konceptu.
publish(?Model $by = null)WorkflowVersionZ konceptu sa stane aktuálna verzia.
retire() / activate()WorkflowDefinitionZastaví alebo povolí nové spustenia; bežiace inštancie dobehnú.
resolveFlag(string $node, string $path)WorkflowVersionZruší príznak na kontrolu zo šablóny.
rotateWebhook()WorkflowDefinitionNové id webhooku.
versions() / version(int $number)Collection / ?WorkflowVersionVšetky verzie podľa čísla, alebo jedna.
instances(?InstanceStatus $status = null, int $perPage = 25)CursorPaginatorHistória, od najnovších.
start(?Model $subject = null)PendingStartRučné spustenie tejto definície.
dryRun(?int $version = null)PendingDryRunAktuálna verzia, inak koncept; NoVersionException, ak žiadna nie je alebo číslo neexistuje.
export(?int $version = null)TemplatePayloadPrenosná šablóna; NoVersionException rovnako.

Workflows::definitions()

MetódaVraciaČo robí
create(string $key, string $name, ?string $subjectType = null, ?Model $owner = null, ?string $description = null)WorkflowDefinitionDefinícia v stave draft s verziou 1 s minimálnym grafom (ručný spúšťač → end).
createWith(CreateDefinitionData $data)WorkflowDefinitionTo isté z DTO.
find(string $key, ?Model $owner = null)?WorkflowDefinitionAk chýba, null.
exists(string $key, ?Model $owner = null)boolČi kľúč v danom rozsahu existuje.
all(?Model $owner = null)CollectionVšetky definície vlastníka.
sync(?string $path = null, ?Model $owner = null, bool $publish = false, bool $dryRun = false)SyncReportVytvorí, uloží koncept a publikuje zo súborov JSON ($path null = workflows.sync.path).
restore(string $key, ?Model $owner = null)WorkflowDefinitionObnoví mäkko zmazanú definíciu.

Workflows::versions()

MetódaVraciaČo robí
validate(array|GraphBuilder $graph, ?string $subjectType = null, ?Model $owner = null)ValidationReportValiduje ľubovoľný graf.
diff(WorkflowVersion $from, WorkflowVersion $to)VersionDiffZmeny uzlov a hrán medzi dvoma verziami jednej definície.
overlay(WorkflowVersion $version)OverlayReportBežiace, čakajúce a zlyhané inštancie podľa aktuálneho uzla.
export(WorkflowVersion $version)TemplatePayloadPayload roundly.workflows.template/v1.
import(TemplatePayload|array $payload, ?Model $owner = null, ?string $key = null)ImportResultNová definícia v stave draft s premapovanými id a príznakmi na kontrolu.
dryRun(WorkflowVersion|array|GraphBuilder $graph, ?WorkflowDefinition $definition = null)PendingDryRunSkúšobný beh neuloženého grafu alebo ľubovoľnej verzie.

Workflows::instances()

MetódaVraciaČo robí
find(int|string $id)?WorkflowInstancePodľa ULID (bez ohľadu na veľkosť písmen) alebo primárneho kľúča; hodnota, ktorú stĺpec nepojme, sa jednoducho nenájde.
recent(?InstanceStatus $status = null, ?string $definition = null, ?Model $owner = null, int $limit = 25)CollectionOd najnovších.
detail(WorkflowInstance $instance)WorkflowInstanceNačíta definíciu, verziu, záznam krokov, čakajúce čakania a čakajúce eskalácie.
steps(WorkflowInstance $instance)CollectionVšetky pokusy v poradí.
retry(WorkflowInstance $instance)WorkflowInstanceZopakuje zlyhanú inštanciu od zlyhaného kroku.
cancel(WorkflowInstance $instance, ?string $reason = null)WorkflowInstanceZruší bežiacu alebo čakajúcu inštanciu.

Workflows::for($subject) a $subject->workflows()

MetódaVraciaČo robí
start(string $key, ?Model $owner = null)PendingStartDefinícia vlastníka subjektu, inak definícia celej aplikácie; výslovne zadaný vlastník hľadá len vo svojom rozsahu.
emit(string $event, array $payload = [], ?string $idempotencyKey = null, ?Model $user = null)EmitResultEmit pre tento subjekt.
instances(int $perPage = 25)CursorPaginatorOd najnovších, s načítaným vlastníkom a spúšťajúcim.
running()CollectionBežiace alebo čakajúce inštancie.
cancelAll(?string $reason = null)intPočet zrušených inštancií — vrátane detí zrušeného rodiča; inštancia, ktorá medzitým skončila, sa preskočí.
touch()intPočet znova vyhodnotených podmienkových čakaní.

Ďalšie accessory

AccessorMetódaVracia
catalogue()register(string|StepType $type)StepType
catalogue()all() / find($key) / has($key)array / ?StepType / bool
catalogue()export()CatalogueExport
subjects()register(SubjectTypeBuilder|SubjectTypeDefinition $type)SubjectTypeDefinition
subjects()find($key) / export($key) / all()?SubjectTypeDefinition / SubjectTypeDefinition / array
calendars()register(string $name, Closure $resolver)self
calendars()find(string $name, ?Model $owner = null, ?string $timezone = null)BusinessCalendar
calendars()names()list<string>
triggers()webhook(string $hookId, array $payload, array $headers = [])StartResult
triggers()map(string $event, string $key, ?string $subject, ?string $user, list|string|null $payload, ?string $idempotencyKey)void
triggers()listen(string $event) / events()void / array<string, string>
schema()graph() / template() / definitions()array

Buildery

BuilderMetódy
PendingStartinput(array $input), by(?Model $user), idempotencyKey(?string $key), withForm(Request $request, bool $submit = false) → self; dispatch(): StartResult
PendingDryRunsubject(Model), sample(array), input(array), event(string $key, array $payload = []), assume(array), at(CarbonInterface), log(bool = true), by(?Model) → self; run(): DryRunResult, explore(): DryRunTree
SubjectTypeBuilderlabel(string), ownedBy(string $relation), ownerType(bool = true), ability(string), field(string $name, FieldType|string $type, ?string $label = null, string|array|null $options = null, ?string $path = null, bool $writable = false) → self; key(), build()

Hodnotové objekty, DTO, modely a enumy

  • DTO (všetky final readonly, s verejnými promoted vlastnosťami): StartData, StartResult (wasSkipped(), wasRefused()), EmitData, EmitResult (started, resumed, failed; skipped()), EmitFailure (definition, exception; code()), CreateDefinitionData, DryRunData, DryRunResult, DryRunStep, DryRunTree, WouldBeAction, SideEffect, SimulatedStep, ValidationReport, ValidationError, EdgeReference, VersionDiff, NodeChange, EdgeChange, OverlayReport, NodeOverlay, TemplatePayload, ImportResult, ReviewFlag, SyncReport, SyncedDefinition, WakeReport, PruneReport, CatalogueExport, CatalogueEntry, SubjectTypeDefinition, FieldDefinition, EventMapping, PartyReference, Duration, RetryPolicy, Actor, Signal, StepAuthorization, TransitionOutcome, DoctorFinding.
  • Graph\Graph, Graph\Node a Graph\Edge sú spracovaný graf len na čítanie (StepContext::graph(), node(), WorkflowVersion::parsedGraph()): node($id), nodesOfType($type), trigger(), outgoing($id), incoming($id), edgeFor($from, $outcome), setting($key, $default), toArray().
  • Modely (vymeniteľné cez workflows.models.*) majú $guarded = [], factory, nastaviteľný kľúč a časové údaje v UTC. Všetky sa mažú mäkko okrem WorkflowIdempotencyKey; workflows:prune maže natrvalo.
  • Enumy sú reťazcové s preloženými popismi cez pomocníkov z enums-for-laravel.
ModelRelácieMetódy
WorkflowDefinitionowner() MorphTo, versions() HasMany, currentVersion() BelongsTo, instances() HasManyisActive()
WorkflowVersiondefinition() BelongsTo, publisher() MorphToreviewFlags(), setReviewFlags(array), isPublished(), parsedGraph(): Graph
WorkflowInstancedefinition(), version(), parent() BelongsTo; owner(), subject(), starter() MorphTo; children(), stepRuns(), waits(), escalations() HasManyfailure(): FailureCode|string|null, path(): list<string>
StepRuninstance() BelongsTo, waits(), escalations() HasManyerror(): FailureCode|string|null
WorkflowWaitinstance(), stepRun() BelongsTo—
WorkflowEscalationinstance(), stepRun() BelongsTo—
WorkflowIdempotencyKeyinstance() BelongsTo—
WorkflowDryRundefinition() BelongsTo, requester() MorphTo—
EnumHodnoty
ActorModesystem, on_behalf_of
ConditionOperatorequals, in, gt, lt, between, empty, contains, before, after
DefinitionStatusdraft, active, retired
DoctorLevelok, warn, fail
DurationUnitminutes, hours, days, weeks, months, business_minutes, business_hours, business_days; isBusiness()
EscalationStatuspending, claimed, fired, failed, cancelled
FieldTypestring, text, integer, decimal, boolean, date, datetime, enum, party, list
InstanceStatusrunning, waiting, completed, failed, cancelled; isTerminal(), isActive()
Severityerror, warning
SignalKindtimer, event, condition, probe, retry, timeout
StepRunStatusqueued, running, waiting, completed, failed, cancelled
SyncStatuscreated, drafted, published, unchanged, invalid, failed
TriggerTypemanual, event, schedule, webhook
VersionStatusdraft, published, superseded
WaitKindtimer, event, condition, retry, timeout
WaitStatuspending, claimed, fired, cancelled
ValidationCodeKaždý kód validácie — pozri Validácia pri publikovaní.
FailureCodeKaždý kód zlyhania enginu, vstavaných krokov a prepojení; fromStored(), detail(), retryable(), message() — pozri Riešenie problémov.
WorkflowOperationČo zaznamenáva fake — pozri Testovanie.

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.