solution-forest/workflow-engine-core
Framework-agnostic workflow engine core for PHP 8.3+. Define and run workflows with type-safe steps, state tracking/persistence, plugins for actions/storage, retries, timeouts, and rich error handling. Actively developed; not production-ready.
if-else in services) with a declarative, maintainable system.✅ Framework-agnostic PHP project needing workflow orchestration (no Laravel/Symfony coupling). ✅ Complex, multi-step processes with retries, timeouts, and conditional branching. ✅ Need for state persistence (e.g., long-running jobs, background tasks). ✅ Team lacks expertise in building robust workflow engines from scratch. ✅ Requirements for observability (events, state tracking, progress reporting). ✅ PHP 8.3+ environment with modern tooling (Composer, PHPStan, Pest).
❌ Production-ready stability needed (package is pre-v1.0, actively under development). ❌ Tight integration with Laravel/Symfony (e.g., using Laravel’s built-in queues or Symfony’s Messenger). ❌ Need for GUI workflow designers (e.g., Camunda, Zeebe, or Temporal). ❌ Serverless/edge computing (package assumes persistent storage; not optimized for ephemeral environments). ❌ Real-time workflows (e.g., gaming, trading systems) requiring sub-millisecond latency. ❌ Existing investment in custom workflow solutions (refactoring cost may outweigh benefits).
"This workflow engine lets us automate complex business processes—like order fulfillment or employee onboarding—without custom development. It’s like hiring a reliable, scalable process manager for our PHP apps. By adopting this, we’ll:*
"This is a batteries-included workflow engine for PHP. Key benefits:
validate → payment → fulfillment) instead of spaghetti logic.WorkflowStarted, StepFailed) and progress tracking."This package gives you superpowers for complex workflows in PHP. Here’s what you get:
WorkflowBuilder::create('order-processing')
->addStep('validate', ValidateOrderAction::class)
->when('order.total > 1000', fn($b) => $b->addStep('fraud_check'))
->addStep('fulfillment', ShipOrderAction::class)
->build();
SendSMSAction) or storage adapters (e.g., Redis).COMPLETED → RUNNING).
Downside: It’s not production-ready yet—we’ll need to track its roadmap and patch gaps (e.g., timeout enforcement). Let’s start with a spike to test integration with our stack."*How can I help you explore Laravel packages today?