mohamedhekal / ordermachine
Configurable order lifecycle state machine for Laravel with guards, history, and events
Requires
- php: ^8.2
- illuminate/auth: ^11.0|^12.0
- illuminate/contracts: ^11.0|^12.0
- illuminate/database: ^11.0|^12.0
- illuminate/events: ^11.0|^12.0
- illuminate/support: ^11.0|^12.0
Requires (Dev)
- laravel/pint: ^1.18
- orchestra/testbench: ^9.0|^10.0
- pestphp/pest: ^3.0
- pestphp/pest-plugin-laravel: ^3.0
- phpstan/phpstan: ^2.0
README
Search terms: laravel, orders, state-machine, fsm, oms, erp, lifecycle, php, laravel-package, order-status, ecommerce, transitions.
Configurable order lifecycle state machine for Laravel OMS/ERP apps: explicit states, guarded transitions, history, and domain events.
Installation
composer require mohamedhekal/ordermachine php artisan vendor:publish --tag=ordermachine-config php artisan migrate
Setup
use Hekal\OrderMachine\Concerns\HasOrderLifecycle; use Illuminate\Database\Eloquent\Model; class Order extends Model { use HasOrderLifecycle; protected $guarded = []; }
Ensure your orders table has a status column (configurable).
Usage
$order->transition('confirm'); $order->transition('pack'); $order->transition('ship'); $order->transition('deliver'); $order->canTransition('cancel'); $order->allowedTransitions(); $order->stateHistory;
Or via facade:
use Hekal\OrderMachine\Facades\OrderMachine; OrderMachine::apply($order, 'confirm');
Default graph
pending → confirmed → packed → shipped → delivered
cancel from pending|confirmed|packed
Customize in config/ordermachine.php. Add guards as invokable classes implementing TransitionGuard.
Events
OrderStateTransitioned fires after a successful transition (inside the same DB transaction after history write).
Testing
composer install && composer test
License
MIT