It's based on the AbstractFactory pattern.
To fully use polymorphism for all your statemachines, you should instantiate
all your machines via factories.
Full polymorphism allows you to build tooling that is the same for every
statemachine you use in your program. The only thing you would need to do is
instantiate the different factories to produce the different machines.
The different sql backends provided store a fully qualified factory class
name for a machine so you can instantiate factories dynamically.
implement the abstract methods in a factory subclass specific to your problem
domain.
$factory = new MySpecificFactory($dependencies_injected_here);
$machine = $factory->getStateMachine($order->getId());
$factory->add($machine->getInitialState());
$machine->run();
createContext()
защищенный Метод
Factory method to get a configured Context with the default Builder
and persistence adapter for a concrete statemachine type.
protected createContext ( Identifier $identifier ) : Context |
$identifier |
Identifier |
|
Результат |
Context |
|
getStateMachine()
публичный Метод
TRICKY: When using this method it could lead to unoptimized creation
of different builders/loaders/persistence objects.
For example: a Loader can be reused, a databaseloader will only have
to access a database once for a specific machine to get all the
transitions.
When using this method when inside a loop of some sorts where multiple
statemachines for different entities are needed, it would be wise to
cache/reuse the different loaders, builders and persistence adapters.
php's spl_object_hash() method would be a good way to cache a fully
loaded statemachine.
Furthermore, once a Loader, ReferenceBuilder and Adapter for persistence
have been instantiated, they can be cached in a field of this class since
they can safely be reused and shared. Or just change the context on a
machine to have access to all the same transitions, builders etc. of the
machine.
public getStateMachine ( string $id ) : StateMachine |
$id |
string |
the entity id for the Identifier |
Результат |
StateMachine |
a statemachine ready to go |