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 potrebuje | Volanie | Vykreslenie |
|---|---|---|
| Formát dokumentu | Workflows::schema()->graph(), ->template(), ->definitions() | JSON Schema (draft 2020-12) |
| Paleta krokov | Workflows::catalogue()->export() | CatalogueEntryResource::collection($export->types) |
| Formulár každého kroku | CatalogueEntry::$configSchema | Ľubovoľný renderer formulárov z JSON Schema; #/$defs zo schema()->definitions() |
| Výsledky uzla (popisy hrán) | CatalogueEntry::$outcomes | Môžu závisieť od konfigurácie: po úprave ich prepočítajte. |
| Výber polí | Workflows::subjects()->export($subjectType) | SubjectTypeResource |
| Kalendáre | Workflows::calendars()->names() | — |
| Namapované udalosti | Workflows::triggers()->events() | — |
| Načítanie / uloženie konceptu | definition($key, $owner)->draft(), ->edit($graph, $expectedChecksum) | VersionResource |
| Priebežná validácia | definition(...)->validate() / versions()->validate($graph, $subjectType, $owner) | ValidationReportResource (chyby nesú node, edge, path) |
| Publikovanie | definition(...)->publish(by: $user) | InvalidGraphException → jej report |
| Porovnanie verzií | versions()->diff($from, $to) | VersionDiffResource |
| Testovací režim | definition(...)->dryRun()->sample([...])->assume([...])->run() / ->explore() | DryRunResultResource |
| Živý prehľad behov | versions()->overlay($version) | OverlayResource |
| História a záznam krokov | definition(...)->instances(), instances()->steps($instance) | InstanceResource, StepRunResource |
| Detail jedného behu | instances()->detail($instance) | InstanceResource (steps, waits, escalations) |
| Kópia medzi vlastníkmi | versions()->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']));| Resource | Obaľuje | Polia |
|---|---|---|
DefinitionResource | WorkflowDefinition | id, key, name, description, subject_type, status {value, label}, owner, current_version, draft, created_at, updated_at |
VersionResource | WorkflowVersion | id, number, status, graph, trigger, actor, checksum, review_flags, published_at, published_by |
InstanceResource | WorkflowInstance | id (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 |
WaitResource | WorkflowWait | kind {value, label}, due_at, event, status |
EscalationResource | WorkflowEscalation | level, due_at, status, fired_at |
StepRunResource | StepRun | node, type, visit, attempt, status, outcome, input, output, error {code, message, retryable}, scheduled_for, started_at, finished_at |
CatalogueEntryResource | CatalogueEntry | key, label, description, category, config_schema, output_schema, outcomes [{key, label, required}], side_effects, escalations, available, package |
SubjectTypeResource | SubjectTypeDefinition | key, label, owner_type, fields [{name, type, label, writable, options}] |
ValidationReportResource | ValidationReport | valid, errors [{code, severity, message, node, edge {from, to, outcome}|null, path, params}] |
VersionDiffResource | VersionDiff | from, to, identical, nodes {added, removed, changed, moved}, edges {added, removed, relabelled}, trigger, settings |
OverlayResource | OverlayReport | version, total, nodes [{node, running, waiting, failed}] |
DryRunResultResource | DryRunResult | valid, started, reason, path, actions, ended_at, ended_by, report |
TemplateResource | TemplatePayload | schema, 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ácie | Predvolená trieda | Dostane |
|---|---|---|
workflows.resources.owner | WorkflowOwnerResource | Model vlastníka. |
workflows.resources.subject | WorkflowSubjectResource | Model subjektu. |
workflows.resources.user | WorkflowUserResource | Použí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());
}| HTTP | Výnimky |
|---|---|
| 404 | UnknownDefinitionException, NoVersionException, SubjectOwnerMismatchException |
| 409 | DefinitionNotActiveException, DefinitionKeyTakenException, DraftConflictException, NothingToPublishException, PublishedVersionImmutableException, TriggerMismatchException, InstanceNotRetryableException, InstanceNotCancellableException |
| 422 | InvalidGraphException, InvalidTriggerInputException, InvalidDefinitionException, InvalidEventKeyException, InvalidTemplateException, InvalidDiffException, MissingIdempotencyKeyException, MissingTriggeringUserException, SubjectTypeMismatchException, UnknownSubjectTypeException, UnknownStepTypeException, UnknownCalendarException, BusinessCalendarNeverOpenException |
| 403 | StepAuthorizationDeniedException |
| 500 | DuplicateStepTypeException, 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 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.