createNode('calculate_total_price', 'calculate_total_price')->end() ->createNode('calculate_shipping_price', 'calculate_shipping_price')->end() ->createTransition('calculate_total_price', 'calculate_shipping_price')->end() ->createStartTransition('calculate_total_price')->end() ->getProcess() ; // Create graph $graph = (new VisualizeFlow())->createGraph($process); // Create the process engine with callbacks $engine = new ProcessEngine(new DefaultBehaviorRegistry([ 'calculate_total_price' => function(Token $token) { $totalPrice = 0; foreach ($token->getValue('items') as $item) { echo 'item price: '.$item['price'].PHP_EOL; $totalPrice += $item['price']; } $token->setValue('total_price', $totalPrice); echo 'total price: '.$totalPrice.PHP_EOL; }, 'calculate_shipping_price' => function(Token $token) { $totalPrice = $token->getValue('total_price'); $token->setValue('shipping_price', $totalPrice * 0.1); echo 'shipping price: '.$token->getValue('shipping_price').PHP_EOL; }, ])); $token = $engine->createTokenFor($process->getStartTransition()); $token->setValue('items.0.price', rand(10, 100)); $token->setValue('items.1.price', rand(10, 100)); $engine->proceed($token); echo "Proceeded.\n"; // Get the raw tokens $rawTokens = []; if ($engine instanceof ProcessEngine) { $tokens = iterator_to_array($engine->getProcessTokens($process)); foreach ($tokens as $token) { $rawTokens[] = get_values($token); } // Needed? apply tokens (new VisualizeFlow())->applyTokens($graph, $process, $tokens); } echo "Tokens applied to Viz Flow\n"; // Save digraph into temp file $tmpFile = tempnam(sys_get_temp_dir(), 'dot-sequence-'); $digraph = (new BuildDigraphScript())->build($graph); try { file_put_contents($tmpFile, $digraph); echo 'Graph Saved to file: '.$tmpFile.PHP_EOL; // Call dot to create PNG from graph exec('dot -Tpng ' . $tmpFile . ' > ' . __DIR__ . '/sequence-graph.png'); } finally { unlink($tmpFile); }