Validácia pri publikovaní
$report = Workflows::definition('purchase-approval', $team)->validate(); // the draft
$report = Workflows::versions()->validate($graph, 'purchase_request', $team); // any graph
$report->valid(); // no errors (warnings don't block)
$report->errors; // list<ValidationError>
$report->errorsOnly(); // and ->warnings()
$report->find(ValidationCode::UnknownField, 'check');
$report->has(ValidationCode::UnknownField, 'check');
$report->toArray();ValidationError{code: ValidationCode, severity: error|warning, message (preložená), node: ?string, edge: ?{from, to, outcome}, path: ?string (JSON pointer), params: array}. Správy nikdy neobsahujú názov triedy. publish() spustí úplnú validáciu pod zámkom definície a pri chybách vyhodí InvalidGraphException (s reportom); jej správa uvedie prvé problémy. Uloženie konceptu kontroluje len štruktúru:
use RoundlyConsulting\Workflows\Exceptions\InvalidGraphException;
try {
Workflows::definition('purchase-approval', $team)->publish(by: $admin);
} catch (InvalidGraphException $e) {
$e->validationReport()->toArray(); // [{code, severity, message, node, edge, path, params}, …]
}Prechody
Spustia sa všetky prechody a zbierajú chyby; predčasne skončí len štrukturálne zlyhanie:
- Štruktúra: verzia schémy, tvar uzlov a hrán, vzor id, duplicitné id, visiace hrany, stropy veľkosti.
- Katalóg: známe typy uzlov; prepojený typ, ktorého balík chýba → adapter_missing s params.package.
- Konfigurácia: JSON schéma typu (invalid_config + path), potom jeho sémantické kontroly, potom bloky eskalácií.
- Spúšťač a koniec: presne jeden spúšťač, aspoň jeden koniec, žiadna hrana do spúšťača ani z uzla end.
- Výsledky: každý povinný výsledok má práve jednu hranu; žiadne neznáme ani duplicitné výsledky.
- Dosiahnuteľnosť: každý uzol je dosiahnuteľný zo spúšťača.
- Cykly: po odstránení strážených hrán — hrany continue uzla loop a výstupu z delay s kladným for — nezostane žiadny cyklus.
- Polia a odkazy: cesty k poliam, operátory, typy hodnôt, zapisovateľnosť, vstupy, odkazy na predchodcov, určenie vlastníka subjektu.
- Aktér: on_behalf_of potrebuje spúšťač s používateľom.
- Príznaky z importu: nevyriešené príznaky na kontrolu zo šablóny.
- Naprieč definíciami: ciele start_workflow pre vlastníka existujú, majú ručný spúšťač a dostanú povinné vstupy; statické spustenie seba samého bez wait: false je varovanie.
Kódy
| Kód | Význam |
|---|---|
invalid_schema_version | schema nie je roundly.workflows.graph/v1 |
invalid_structure | Tvar dokumentu je nesprávny |
invalid_node_id | Id porušuje ^[a-z][a-z0-9_]{0,63}$ (správa nikdy nezopakuje odoslané id) |
duplicate_node | Dva uzly majú rovnaké id |
dangling_edge | Hrana ukazuje na neznámy uzol |
graph_too_large | Prekročený strop veľkosti |
unknown_node_type | Žiadny typ kroku s týmto kľúčom |
adapter_missing | Typ potrebuje balík, ktorý nie je nainštalovaný |
invalid_config | Konfigurácia porušuje schému alebo pravidlá typu |
trigger_count | Nie je presne jeden spúšťač |
no_end | Chýba uzol end |
trigger_has_incoming | Do spúšťača vedie hrana |
end_has_outgoing | Z uzla end vychádza hrana |
missing_outcome | Povinný výsledok nemá hranu |
unknown_outcome | Hrana uvádza výsledok, ktorý typ nemá |
duplicate_outcome | Dve hrany pre jednu dvojicu (from, outcome) |
outcome_label_required | Hrana bez výsledku z uzla, ktorého výsledky nie sú len next (params: outcome, výsledky typu) |
unreachable_node | Uzol nie je dosiahnuteľný zo spúšťača |
cycle_without_breaker | Cyklus neprechádza hranou continue uzla loop ani oneskorením s kladným for (params.nodes) |
unknown_field | Cesta k poľu nie je registrovaná |
operator_not_allowed | Operátor sa nehodí k typu poľa |
invalid_value | Literál nesprávneho typu |
unknown_input | input.* nie je deklarovaný |
invalid_reference | steps.<id> nie je predchodca |
field_not_writable | set_field na poli, ktoré nie je zapisovateľné alebo je stavom lifecycle |
subject_owner_unresolvable | Definícia s vlastníkom nad typom subjektu bez určenia vlastníka |
unknown_subject_type | Typ subjektu definície nie je registrovaný |
actor_requires_user | on_behalf_of so spúšťačom schedule alebo webhook |
unresolved_import_reference | Príznak na kontrolu zo šablóny je stále otvorený |
unknown_definition | Cieľ start_workflow pre vlastníka neexistuje |
child_trigger_not_manual | Cieľ start_workflow nemá ručný spúšťač |
missing_child_input | Povinný vstup dieťaťa nie je namapovaný |
self_start | Varovanie: definícia spúšťa samu seba |
unknown_calendar | Názov kalendára pre vlastníka nie je známy |
roles_unavailable | Strana typu role bez vyhodnocovania rolí |
invalid_cron | Cron výraz, ktorý parser odmietne (params.token) |
condition_too_complex | Príliš hlboká alebo s priveľa klauzulami |
unknown_transition | Prepojenie s lifecycle: taký prechod neexistuje |
unknown_notification_type | Prepojenie s notifications: taký typ neexistuje |
unknown_form | Spúšťač s formulárom uvádza formulár, ktorý forms-for-laravel nemá (bez nainštalovaného forms: adapter_missing) |
Vstup z prehliadača je nedôveryhodný: validácia aj uloženie konceptu odpovedia na akýkoľvek dokument — nesprávne typy na každej úrovni, hlboké vnorenie, obrovské reťazce — cez ValidationReport alebo InvalidGraphException, nikdy TypeError, a žiadna chybová správa nezopakuje odoslanú hodnotu.
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.