1. Go to this page and download the library: Download sbooker/workflow 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/ */
sbooker / workflow example snippets
// src/Orders/Domain/Status.php
namespace App\Orders\Domain;
use Sbooker\Workflow\Status as BaseStatus;
final class Status extends BaseStatus
{
private const NEW = 'new';
private const PAID = 'paid';
private const SENT = 'sent';
public static function new(): self
{
return new self(self::NEW);
}
public static function paid(): self
{
return new self(self::PAID);
}
public static function sent(): self
{
return new self(self::SENT);
}
}
// src/Orders/Domain/OrderWorkflow.php
namespace App\Orders\Domain;
use Sbooker\Workflow\Workflow;
use Ds\Map;
use Ds\Set;
final class OrderWorkflow extends Workflow
{
public function __construct()
{
// Начальный статус - неотъемлемая часть определения этого жизненного цикла.
parent::__construct(Status::new());
}
protected function getStatusClass(): string
{
return Status::class;
}
protected function buildTransitionMap(): Map
{
$map = new Map();
// Используем put() для добавления переходов с объектами в качестве ключей
$map->put(Status::new(), new Set([ Status::paid() ]));
$map->put(Status::paid(), new Set([ Status::sent() ]));
return $map;
}
}
// src/Orders/Domain/Order.php
namespace App\Orders\Domain;
final class Order
{
private OrderWorkflow $workflow;
public function __construct()
{
$this->workflow = new OrderWorkflow();
}
public function pay(): void
{
$this->workflow->transitTo(Status::paid());
}
public function getStatus(): Status
{
return $this->workflow->getStatus();
}
}
// src/UseCase/PayOrder/Handler.php
use Sbooker\Workflow\FlowError;
$order = $orderRepository->get($orderId); // Заказ в статусе 'NEW'
try {
$order->pay(); // Успешно! Статус изменится на 'PAID'
// Эта строка вызовет исключение FlowError
$order->pay();
} catch (FlowError $e) {
// Обрабатываем ошибку бизнес-логики
$this->logger->error("Invalid status transition: " . $e->getMessage());
}
Loading please wait ...
Before you can download the PHP files, the dependencies should be resolved. This can take some minutes. Please be patient.