Now we define the workflow itself. We do this by defining the input and output types on each node. Here is the minimal implementation of the nodes for the purpose of this demo.
InitialNode
NodeOne
NodeTwo
Define the Workflow attaching the nodes:
The full output will be:
Of course there is still not much point to a workflow if you just run through it from beginning to end! Let's do some branching and looping.
Monitoring & Debugging
Before moving into the Workflow creation process, we recommend having the monitoring system in place. It could make the learning curve of how Workflow works much easier. The best way to monitoring Workflow is with Inspector.
After you sign up at the link above, make sure to set the INSPECTOR_INGESTION_KEY variable in the application environment file to monitoring Workflow execution:
namespace App\Neuron;
use NeuronAI\Workflow\Node;
use NeuronAI\Workflow\StartEvent;
use App\Neuron\FirstEvent;
class InitialNode extends Node
{
/**
* Gets the "StartEvent" and returns "FirstEvent"
*/
public function __invoke(StartEvent $event, WorkflowState $state): FirstEvent
{
echo "\n- Handling StartEvent";
return new FirstEvent("InitialNode complete");
}
}
vendor/bin/neuron make:node App\\Neuron\\NodeOne
.\vendor\bin\neuron make:node App\Neuron\NodeOne
class NodeOne extends Node
{
/**
* Takes "FirstEvent" as input and returns "SecondEvent"
*/
public function __invoke(FirstEvent $event, WorkflowState $state): SecondEvent
{
echo "\n- ".$event->firstMsg;
return new SecondEvent("NodeOne complete");
}
}
vendor/bin/neuron make:node App\\Neuron\\NodeTwo
.\vendor\bin\neuron make:node App\Neuron\NodeTwo
class NodeTwo extends Node
{
/**
* Takes "SecondEvent" as input and returns "StopEvent"
*/
public function __invoke(SecondEvent $event, WorkflowState $state): StopEvent
{
echo "\n- ".$event->secondMsg;
echo "\n- NodeTwo complete";
return new StopEvent();
}
}
use NeuronAI\Workflow\Workflow;
$handler = Workflow::make()
->addNodes([
new InitialNode(),
new NodeOne(),
new NodeTwo(),
])
->init();
/*
* Run the workflow
*/
$handler->run();