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

Vizuálny editor

Balík neobsahuje žiadne UI. Editoru dá všetko, čo potrebuje na kreslenie, úpravy, kontrolu, porovnanie, náhľad a sledovanie workflowu. Zapojte to za vlastné controllery a autorizáciu (len pre správcov vlastníka):

Editor potrebujeVolanieVykreslenie
Formát dokumentuWorkflows::schema()->graph(), ->template(), ->definitions()JSON Schema (draft 2020-12)
Paleta krokovWorkflows::catalogue()->export()CatalogueEntryResource::collection($export->types)
Formulár každého krokuCatalogueEntry::$configSchemaĽubovoľný renderer formulárov z JSON Schema; #/$defs zo schema()->definitions()
Výsledky uzla (popisy hrán)CatalogueEntry::$outcomesMôžu závisieť od konfigurácie: po úprave ich prepočítajte.
Výber políWorkflows::subjects()->export($subjectType)SubjectTypeResource
KalendáreWorkflows::calendars()->names()—
Namapované udalostiWorkflows::triggers()->events()—
Načítanie / uloženie konceptudefinition($key, $owner)->draft(), ->edit($graph, $expectedChecksum)VersionResource
Priebežná validáciadefinition(...)->validate() / versions()->validate($graph, $subjectType, $owner)ValidationReportResource (chyby nesú node, edge, path)
Publikovaniedefinition(...)->publish(by: $user)InvalidGraphException → jej report
Porovnanie verziíversions()->diff($from, $to)VersionDiffResource
Testovací režimdefinition(...)->dryRun()->sample([...])->assume([...])->run() / ->explore()DryRunResultResource
Živý prehľad behovversions()->overlay($version)OverlayResource
História a záznam krokovdefinition(...)->instances(), instances()->steps($instance)InstanceResource, StepRunResource
Detail jedného behuinstances()->detail($instance)InstanceResource (steps, waits, escalations)
Kópia medzi vlastníkmiversions()->export() / versions()->import($payload, $owner) + resolveFlag()TemplateResource
  • Dve karty: kontrolný súčet, ktorý editor načítal, posielajte ako $expectedChecksum; zastarané uloženie vyhodí DraftConflictException (409).
  • Nedokončené grafy sa uložia bez problémov; úplnú validáciu robí až publikovanie.
  • Pozície a popisy patria do objektu ui každého uzla — ukladá sa doslovne, engine ho ignoruje a porovnanie ho hlási ako presun.
  • Id uzlov určuje editor (^[a-z][a-z0-9_]{0,63}$); importy ich premapujú (ImportResult::$idMap).
  • Validačné chyby ukazujú na uzol, hranu alebo JSON pointer v konfigurácii uzla, takže editor môže zvýrazniť presné pole. Správy sú preložené (en, sk) a neobsahujú názvy tried.
  • Nikde žiadne názvy tried: typy subjektov sú kľúče z registra, odkazy sa vykresľujú cez referenčné resources.

JSON resources

API pre editor a správu je vaše: použite manažéra a tieto resources (RoundlyConsulting\Workflows\Http\Resources) za vlastnou autorizáciou:

use RoundlyConsulting\Workflows\Http\Resources\{CatalogueEntryResource, InstanceResource, ValidationReportResource};

// The palette and a step's form
return CatalogueEntryResource::collection(Workflows::catalogue()->export()->types);

// Live validation
return new ValidationReportResource(Workflows::versions()->validate($request->input('graph'), 'purchase_request', $team));

// One run in detail: steps, waits and escalations in a fixed number of queries
$instance = Workflows::instances()->find($ulid) ?? abort(404);
Workflows::instances()->detail($instance);

return new InstanceResource($instance->loadMissing(['subject', 'owner', 'starter']));
ResourceObaľujePolia
DefinitionResourceWorkflowDefinitionid, key, name, description, subject_type, status {value, label}, owner, current_version, draft, created_at, updated_at
VersionResourceWorkflowVersionid, number, status, graph, trigger, actor, checksum, review_flags, published_at, published_by
InstanceResourceWorkflowInstanceid (ULID), definition, version, status, subject, subject_type, owner, trigger {type, key}, started_by, current_node, steps_count, depth, failure {code, message, node}, started_at, ended_at; when loaded: steps, waits, escalations
WaitResourceWorkflowWaitkind {value, label}, due_at, event, status
EscalationResourceWorkflowEscalationlevel, due_at, status, fired_at
StepRunResourceStepRunnode, type, visit, attempt, status, outcome, input, output, error {code, message, retryable}, scheduled_for, started_at, finished_at
CatalogueEntryResourceCatalogueEntrykey, label, description, category, config_schema, output_schema, outcomes [{key, label, required}], side_effects, escalations, available, package
SubjectTypeResourceSubjectTypeDefinitionkey, label, owner_type, fields [{name, type, label, writable, options}]
ValidationReportResourceValidationReportvalid, errors [{code, severity, message, node, edge {from, to, outcome}|null, path, params}]
VersionDiffResourceVersionDifffrom, to, identical, nodes {added, removed, changed, moved}, edges {added, removed, relabelled}, trigger, settings
OverlayResourceOverlayReportversion, total, nodes [{node, running, waiting, failed}]
DryRunResultResourceDryRunResultvalid, started, reason, path, actions, ended_at, ended_by, report
TemplateResourceTemplatePayloadschema, definition {key, name, subject_type, description}, graph, review [{node, path, reason}], exported_at, source {checksum}
  • definition, version, subject, owner, started_by a published_by sa vykresľujú len z načítaných relácií alebo uloženej morph dvojice: kolekcia nikdy nerobí dopyt na každý riadok. Načítajte vopred, čo potrebujete: ->with(['definition', 'version', 'subject', 'owner', 'starter']).
  • Workflows::instances()->detail($instance) cez loadMissing() načíta definíciu, verziu, záznam krokov (v poradí), čakajúce čakania aj čakajúce eskalácie (podľa splatnosti), takže InstanceResource vykreslí steps, waits a escalations pevným počtom dopytov. Bez detail() sa tieto tri kľúče vynechajú.
  • Správy neznámych výnimiek sa nikdy neposielajú von: pri exception alebo worker_timeout je správou preložené workflows::failures.exception; pôvodná správa ostáva v databáze pre operátorov.
  • output.request_id kroku approval je kolo, v ktorom sa rozhoduje cez within().

Referenčné resources — žiadne názvy tried navonok

Modely aplikácie (vlastník, subjekt, používateľ) sa vykresľujú cez referenčný resource — predvolene len {id, type: class_basename}, nikdy morph trieda ani názov triedy. Zmazaný subjekt sa vykreslí z uloženej dvojice bez dopytu:

Kľúč konfiguráciePredvolená triedaDostane
workflows.resources.ownerWorkflowOwnerResourceModel vlastníka.
workflows.resources.subjectWorkflowSubjectResourceModel subjektu.
workflows.resources.userWorkflowUserResourcePoužívateľ (started_by, published_by, žiadateľ skúšobného behu).
final class TeamReferenceResource extends JsonResource
{
    public function toArray(Request $request): array
    {
        return ['id' => $this->resource->getKey(), 'name' => $this->resource->name];
    }
}

// config/workflows.php
'resources' => ['owner' => TeamReferenceResource::class, ...],

Prázdna hodnota použije predvolenú triedu; čokoľvek, čo nie je inštanciovateľná podtrieda JsonResource (vrátane samotnej základnej triedy), vyhodí InvalidWorkflowsConfigurationException s názvom kľúča.

Chyby → HTTP

Každá výnimka balíka rozširuje WorkflowsException s errorCode(), status() a context(); úplný zoznam nájdete v časti Výnimky:

try {
    $result = $workflows->start($key, $subject, $owner)->input($request->all())->by($request->user())->dispatch();
} catch (WorkflowsException $e) {
    return response()->json(['code' => $e->errorCode(), 'message' => $e->getMessage()], $e->status());
}
HTTPVýnimky
404UnknownDefinitionException, NoVersionException, SubjectOwnerMismatchException
409DefinitionNotActiveException, DefinitionKeyTakenException, DraftConflictException, NothingToPublishException, PublishedVersionImmutableException, TriggerMismatchException, InstanceNotRetryableException, InstanceNotCancellableException
422InvalidGraphException, InvalidTriggerInputException, InvalidDefinitionException, InvalidEventKeyException, InvalidTemplateException, InvalidDiffException, MissingIdempotencyKeyException, MissingTriggeringUserException, SubjectTypeMismatchException, UnknownSubjectTypeException, UnknownStepTypeException, UnknownCalendarException, BusinessCalendarNeverOpenException
403StepAuthorizationDeniedException
500DuplicateStepTypeException, InvalidStepTypeException

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.