1. Go to this page and download the library: Download ironbound/state library. Choose the download type require.
2. Extract the ZIP file and open the index.php.
3. Add this code to the index.php.
<?php
require_once('vendor/autoload.php');
/* Start to develop here. Best regards https://php-download.com/ */
ironbound / state example snippets
use IronBound\State\Factory\StateMachineFactory;
use IronBound\State\Graph\GraphId;
use IronBound\State\Transition\TransitionId;
/** @var StateMachineFactory $stateMachineFactory */
$subject = new Order();
$machine = $stateMachineFactory->make($subject, new GraphId('payment'));
$state = $machine->getCurrentState(); // State object for "unpaid"
$machine->apply(new TransitionId('pay'));
echo $subject->paymentStatus; // processing
foreach ($machine->getAvailableTransitions() as $transition) {
echo $transition->getId();
}
if ($machine->evaluate(new TransitionId('refund'))->isValid()) {
// do refund.
}
use IronBound\State\Graph\{GraphId, MutableGraph};
use IronBound\State\ConcreteStateMachine;
use IronBound\State\StateMediator\PropertyStateMediator;
use IronBound\State\State\{StateId, MutableState, StateType};
use IronBound\State\Transition\{TransitionId, MutableTransition};
$graph = new MutableGraph(new GraphId('status'));
$graph->addState(new MutableState(new StateId('pending'), StateType::INITIAL()));
$graph->addState(new MutableState(new StateId('published')));
$graph->addTransition(new MutableTransition(
new TransitionId('publish'),
[ new StateId('pending') ],
new StateId('published')
));
$mediator = new PropertyStateMediator('status');
$stateMachine = new ConcreteStateMachine($mediator, $graph->toImmutable(), $subject);
use IronBound\State\Graph\GraphId;
use IronBound\State\Factory\StateMachineFactory;
/** @var StateMachineFactory $factory*/
$factory->make($subject, new GraphId('status'));
use IronBound\State\Factory\StateMachineFactoryConfigurator;
use IronBound\State\Graph\GraphId;
use IronBound\State\State\StateType;
use IronBound\State\StateMachine;
use IronBound\State\Transition\Evaluation;
$config = [
[
// The test determines which Graphs apply to the given subject. This means that
// GraphIds only have to be unique to the subject type instead of globally.
'test' => [
// This particular test type checks if the subject is an instance of the given class.
'class' => 'Order',
],
// The list of all the graphs for this subject.
'graphs' => [
'payment' => [
'mediator' => [
// Use a mediator that checks against an object's properties.
'property' => 'paymentStatus',
],
// The list of all the available states
'states' => [
'unpaid' => [
// Specifies the StateType manually. The default is NORMAL.
'type' => StateType::INITIAL,
],
// If you don't need any extra configuration options,
// you can just specify a string with no key.
'processing',
'paid',
'refunded' => [
'type' => StateType::FINAL,
// Custom defined attributes.
'attributes' => [
'label' => 'Refunded',
],
],
],
// The list of all the available transitions
'transitions' => [
'pay' => [
// The list of states this transition can be applied from
'from' => 'unpaid',
// The state the subject will be in after transitioning.
'to' => 'processing',
// Custom defined attributes.
'attributes' => [
'label' => 'Pay',
],
],
'complete' => [
'from' => 'processing',
'to' => 'paid',
],
'refund' => [
'from' => [ 'processing', 'paid' ],
'to' => 'refunded',
// Use a guard to add constraints to when a transition is available.
'guard' => static function(StateMachine $machine) {
if ($machine->getSubject()->createdAt + WEEK_IN_SECONDS < time()) {
return Evaluation::invalid('The refund window has expired.');
}
return Evaluation::valid();
}
],
],
],
'delivery' => [
'mediator' => [
'property' => 'deliveryStatus',
],
'states' => [
'processing' => [
'type' => StateType::INITIAL,
],
'in-transit',
'delivered' => [
'type' => StateType::FINAL,
]
],
'transitions' => [
'drop-at-carrier' => [
'from' => 'processing',
'to' => 'in-transit',
],
'deliver' => [
'from' => 'in-transit',
'to' => 'delivered',
],
],
],
],
],
[
'test' => [
'class' => 'BlogPost',
],
'graphs' => [
'states' => [
'draft' => [
'type' => StateType::INITIAL,
],
'published' => [
'type' => StateType::FINAL,
],
],
'transitions' => [
'publish' => [
'from' => 'draft',
'to' => 'published',
],
],
],
],
];
$stateMachineFactory = (new StateMachineFactoryConfigurator())->configure( $config );
$paymentStateMachine = $stateMachineFactory->make(new Order(), new GraphId('payment'));
$deliveryStateMachine = $stateMachineFactory->make(new Order(), new GraphId('delivery'));
$blogPostStateMachine = $stateMachineFactory->make(new BlogPost(), new GraphId('status'));
Loading please wait ...
Before you can download the PHP files, the dependencies should be resolved. This can take some minutes. Please be patient.