Files
state-machine/examples/statemachine.php

54 lines
1.2 KiB
PHP
Raw Permalink Normal View History

2026-01-07 01:24:40 +01:00
<?php
require_once __DIR__."/../vendor/autoload.php";
use NoccyLabs\StateMachine\StateTrait;
use NoccyLabs\StateMachine\StateMachineTrait;
use NoccyLabs\StateMachine\Attributes\ValidTransitions;
enum OrderStatus {
use StateTrait;
#[ValidTransitions([OrderStatus::PROCESSING])]
case PENDING;
#[ValidTransitions([OrderStatus::PROCESSED,OrderStatus::PENDING])]
case PROCESSING;
#[ValidTransitions([OrderStatus::SHIPPED])]
case PROCESSED;
#[NoValidTransitions]
case SHIPPED;
}
class Order {
use StateMachineTrait;
public function __construct(
private OrderStatus $status
)
{
}
public function setStatus(OrderStatus $status): self
{
if (!$this->isValidTransition($this->status, $status)) {
throw new \RuntimeException("Invalid transition");
}
$this->status = $status;
return $this;
}
public function getStatus(): OrderStatus
{
return $this->status;
}
}
$os = new Order(OrderStatus::PENDING);
var_dump($os->getStatus());
try {
$os->setStatus(OrderStatus::PROCESSED);
} catch (\Exception|InvalidTransitionException $e) {
}
var_dump($os->getStatus());
$os->setStatus(OrderStatus::PROCESSING);
var_dump($os->getStatus());