PHP code example of innoge / laravel-enum-states

1. Go to this page and download the library: Download innoge/laravel-enum-states 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/ */

    

innoge / laravel-enum-states example snippets


use Illuminate\Database\Eloquent\Model;
use InnoGE\LaravelEnumStates\Attributes\StateMachine;

#[StateMachine('status', OrderStatus::class)]
final class Order extends Model
{
    protected function casts(): array
    {
        return [
            'status' => OrderStatus::class,
        ];
    }
}

use InnoGE\LaravelEnumStates\Concerns\TransitionsState;
use InnoGE\LaravelEnumStates\Contracts\StateEnum;
use InnoGE\LaravelEnumStates\StateMachine;

enum OrderStatus: string implements StateEnum
{
    use TransitionsState;

    case Pending = 'pending';
    case Paid = 'paid';
    case Shipped = 'shipped';
    case Cancelled = 'cancelled';

    public static function configureStateMachine(StateMachine $machine): StateMachine
    {
        return $machine
            ->default(self::Pending)
            ->allow(self::Pending, [self::Paid, self::Cancelled])
            ->allow(self::Paid, [self::Shipped, self::Cancelled]);
    }
}

$order->status = OrderStatus::Paid;
$order->save();

->allow(self::Pending, self::Paid)

->allow(self::Pending, [self::Paid, self::Cancelled])

->allow([self::Pending, self::Paid], self::Cancelled)

->allow([self::Pending, self::Paid], [self::Cancelled, self::Shipped])

public static function configureStateMachine(StateMachine $machine): StateMachine
{
    return $machine
        ->default(self::Pending)
        ->onEntering(self::Cancelled, [MarkOrderAsCancelled::class])
        ->onLeaving(self::Paid, [ReleaseInventoryHold::class])
        ->allow(self::Pending, self::Paid, actions: [
            MarkOrderAsPaid::class,
        ])
        ->allow(self::Paid, self::Cancelled, actions: [
            function (Order $model, self $from, self $to, string $field, array $context, AuditLogger $audit): void {
                $audit->record($model, $from, $to, $field, $context);
            },
        ]);
}

final readonly class MarkOrderAsPaid
{
    public function __construct(private PaymentGateway $payments) {}

    public function __invoke(Order $model, OrderStatus $from, OrderStatus $to, string $field, array $context): void
    {
        $this->payments->capture($model);
    }
}

$order->status->transitionTo($order, 'status', OrderStatus::Cancelled, reason: 'customer_request');
$order->save();

$order->status->transitionTo(
    $order,
    'status',
    OrderStatus::Cancelled,
    reason: 'customer_request',
);

$order->status->canTransitionTo(OrderStatus::Paid);   // bool
$order->status->transitionableStates();                // OrderStatus[]

OrderStatus::canTransition(OrderStatus::Pending, OrderStatus::Paid);
OrderStatus::transitionableStatesFrom(OrderStatus::Pending);

use InnoGE\LaravelEnumStates\StateOptions;

StateOptions::all(OrderStatus::class);                          // value => label, every case
StateOptions::enabled(OrderStatus::class, $order->status);      // current state + reachable states
StateOptions::disabledValues(OrderStatus::class, $order->status); // values that should be disabled

use InnoGE\LaravelEnumStates\Filament\EnumStateSelect;

EnumStateSelect::make('status')
    ->stateEnum(OrderStatus::class);

EnumStateSelect::make('status')
    ->stateEnum(OrderStatus::class)
    ->currentState(fn (?Order $record): ?OrderStatus => $record?->status);

use InnoGE\LaravelEnumStates\Rules\ValidStateTransition;

'status' => [
    '

Order::where('status', OrderStatus::Paid)->get();
Order::whereNot('status', OrderStatus::Cancelled)->get();