A hierarchical context tree PHP library, with hierarchical parameter bags - context, and actions working with them.
The ArrayContext is the default implementation of the Context interface. It acts as a hierarchical parameter bags, when
items can also be other contexts.
<?php
$context = new ArrayContext();
// can set/get/has values like to parameter bag
$context->set('foo', 123);
$context->get('foo'); // 123
$context->has('foo'); // true
// can iterate
foreach ($context as $key => $value) { }
// can create sub-contexts
$subContext = $context->getOrCreate('sub', SomeContext:class);
// can callback for creation of sub-context
$subContext = $context->getOrCall('sub', function () use ($dependencies) {
    return new SomeContext($dependencies);
});
// can get parent context
$subContext->getParent() === $context;
// can get root context
$leafContext = $subContext->getOrCreate('leaf', ArrayContext:class);
$leafContext->getTopParent() === $context;
// can dump to array
$context->set('bar', ['a' => 1, 'b' => 'x']);
$context->toArray(); // ['foo' => 123, 'bar' => ['a' => 1, 'b' => 'x'], 'sub' => ['leaf' => []]]The ExceptionContext holds single exception, and when other exception is added can chain with other ExceptionContext.
$context = new ExceptionContext(new \Exception('first'));
$context->addException(new \Exception('second'));
$context->addException(new \Exception('third'));
$context->getException()->getMessage(); // first
$context->getLastException()->getMessage(); // thirdThe Action interface defines an action that executes on a Context.
The CompositeAction compose several actions into one, and when executed calls each child action in the order they were added.
The ActionMapper is an invokable interface that gets called to return new instances of actions that will replace the old ones.
Can be used for example to wrap actions to record their execution times and to log details.
<?php
$composite = new ArrayCompositeAction();
$composite->add($actionOne);
$composite->add($actionTwo);
$mapper = new ActionLogWrapper(); // some implementation of the ActionMapper interface
$composite->map($mapper); // inner actions gets replaced with return values of the mapperThe CatchableErrorAction is constructed with two actions. On execute first "main" action is called, and if it throws an
Exception, an ExceptionContext is added to the supplied context and second "error" action is called.
The AbstractWrappedAction is an abstract implementation of the Action interface, that takes inner action as constructor
argument, and on execute first calls own beforeAction(Context $context) protected method, then the inner action execute() method,
and finally own afterAction(Context $context).
