PHP code example of sbooker / workflow

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());
}