Skip to content

Context ​

Context is the data that travels with your state machine. While states describe "where" your machine is, context describes the "what" - the accumulated data from events and computations.

Quick Overview ​

php
MachineDefinition::define(
    config: [
        'initial' => 'idle',
        'context' => [
            'count' => 0,
            'items' => [],
            'total' => 0.0,
        ],
        'states' => [...],
    ],
);

Reading Context ​

php
$state = $machine->state;

// Get a value
$count = $state->context->get('count');

// Check if key exists
$state->context->has('customer');

// Get all as array
$data = $state->context->toArray();

Writing Context ​

Actions modify context during transitions:

php
use Tarfinlabs\EventMachine\Behavior\ActionBehavior;
use Tarfinlabs\EventMachine\Behavior\EventBehavior;
use Tarfinlabs\EventMachine\ContextManager;

class AddItemAction extends ActionBehavior
{
    public function __invoke(
        ContextManager $context,
        EventBehavior $event
    ): void {
        $items = $context->get('items', []);
        $items[] = $event->payload['item'];
        $context->set('items', $items);
    }
}

Context in Guards ​

Guards read context to control transitions:

php
use Tarfinlabs\EventMachine\Behavior\GuardBehavior;
use Tarfinlabs\EventMachine\ContextManager;

class HasItemsGuard extends GuardBehavior
{
    public function __invoke(ContextManager $context): bool
    {
        return count($context->get('items', [])) > 0;
    }
}

MachineInput and Context ​

When a child machine is invoked with a MachineInput class, the input properties are automatically merged into the child's initial context. This means the child can access input values via $context->get('key') as if they were defined in the context array:

php
// Parent delegates with typed input
'processing_payment' => [
    'machine' => PaymentMachine::class,
    'input'   => PaymentInput::class,  // has orderId, amount
    '@done'   => 'completed',
],

// Child can read input values from context
class CapturePaymentAction extends ActionBehavior
{
    public function __invoke(ContextManager $context): void
    {
        $orderId = $context->get('orderId');  // from MachineInput
        $amount  = $context->get('amount');   // from MachineInput
    }
}

The merge happens after the child's default context is initialized, so MachineInput values override any matching default context keys.

Key Concepts ​

ConceptDescription
Initial ContextDefault values when machine starts
ContextManagerClass that holds and manages context data
Custom ContextType-safe context with validation
MachineInputTyped input DTO that auto-merges into child context on delegation
PersistenceContext is saved with each event

Learn More ​

For complete context documentation including:

  • Custom context classes with validation
  • Context validation with Laravel Data attributes
  • Required context in behaviors
  • Magic property access
  • Complete examples

See Working with Context.

Testing

For context assertion methods (assertContext, assertContextHas), see Testing Overview.

Released under the MIT License.