Download the PHP package hpwebdeveloper/laravel-stateflow without Composer
On this page you can find all versions of the php package hpwebdeveloper/laravel-stateflow. It is possible to download/install these versions without Composer. Possible dependencies are resolved automatically.
Download hpwebdeveloper/laravel-stateflow
More information about hpwebdeveloper/laravel-stateflow
Files in hpwebdeveloper/laravel-stateflow
Package laravel-stateflow
Short Description Laravel Model States with Context
License MIT
Informations about the package laravel-stateflow
Laravel StateFlow
A modern, enterprise-ready state machine implementation for Laravel Eloquent models.
Author: Hamed Panjeh
- laravel-pay-pocket https://github.com/HPWebdeveloper/laravel-pay-pocket
- laravel-failed-jobs https://github.com/HPWebdeveloper/laravel-failed-jobs
- laravel-stateflow https://github.com/HPWebdeveloper/laravel-stateflow
Laravel StateFlow is inspired by similar concepts found in Spatie Laravel Model States, however, it is a fully independent, ground-up implementation with its own architecture and design decisions. It combines the state pattern with state machines to deliver enterprise-ready features: automatic state class discovery, automatic transition discovery, permissions, UI metadata, history tracking, and API resources. Laravel StateFlow maintains a single, unified topology of all possible states and transitions in your application's backing enum. This centralized architecture ensures that state definitions remain synchronized across your entire application, eliminating inconsistencies between backend logic and frontend representations. For large, complex systems, managing state changes and transitions is no longer cumbersome or bug-prone as your system growsβa single enum serves as the definitive source of truth.
π¦ Demo Application: See Laravel StateFlow in action with a complete order management demo at laravel-stateflow-demo.
π Table of Contents
- Introduction
- Why Laravel StateFlow?
- The Problem with Manual Transitions
- StateFlow's Solution
- Key Innovations
- Installation
- Preparation in 4 Simple Steps
- How to Use It
- Transitions
- Permissions
- History Tracking
- API Resources
- Query Scopes
- Validation Rules
- Events
- Artisan Commands
- Configuration Reference
- Common Patterns
- Version Compatibility
- Credits
- License
Introduction
This package adds state support to your Eloquent models. It lets you represent each state as a separate class, handles serialization to the database behind the scenes, and provides a clean API for state transitions with full authorization and audit capabilities.
Example: Imagine an Order model with states: Pending, Processing, Shipped, Delivered, and Cancelled. Each state can have its own color for UI, permitted roles for authorization, and the transitions between them are explicit and validated.
Why Laravel StateFlow?
The Problem: Manual State Management in Legacy Systems
In traditional Laravel applications, state management is typically handled with simple string columns and scattered conditional logic:
π€¦ββοΈ This creates several pain points:
Scattered Workflow Definition
- Transitions defined across multiple files β no single source of truth
- To understand your workflow, you must open every file and mentally piece together the graph
- Refactoring is risky β changing one state might break transitions you forgot about
- No way to export or visualize the complete workflow as a diagram
- State dependencies are implicit β you discover them only when something breaks
Frontend/Backend Synchronization Gap
- Views must hardcode which buttons to show for each state
- No built-in way to query available transitions from current state
- UI metadata (colors, icons, labels) lives outside the state machine
- State labels must be duplicated in frontend code β prone to drift
- No TypeScript types generated for frontend consumption
- No way to get human-readable names or descriptions from backend
Missing Enterprise Features
- No permission system β you build authorization logic from scratch
- No audit trail β state changes vanish without history tracking
- No API resources β serializing states for SPAs requires manual work
- No transition metadata β who can perform it, what requirements exist
- No way to attach context to transitions (reasons, notes, actor info)
- No guards for complex conditional transition logic
- No hooks for state-specific business logic (entering/exiting a state)
Data & Querying Limitations
- No efficient scopes to query models by current state
- No way to find models "stuck" in certain states for too long
- State history not queryable β cannot analyze transition patterns
- No reversion capability β cannot rollback to a previous state
Testing & Maintenance Burden
- Hard to visualize complete state flow without documentation
- Difficult to test all transition paths systematically
- State machine grows silently complex as features are added
- Cannot programmatically list all possible transition paths
- Documentation drifts from actual code β no single source of truth
- No IDE support for navigating from state to its allowed transitions
Laravel-StateFlow's Solution: Centralized State Topology
StateFlow supports two approaches for defining your state machine:
| Approach | Best For | Transitions Defined In |
|---|---|---|
| Traditional | Self-contained states, IDE navigation | State classes or model |
| Hybrid Enum | Centralized workflow visualization | Single enum file |
Both approaches are demonstrated in the laravel-stateflow-demo: Orders (traditional) and Bookings (enum).
Laravel StateFlow solves this with centralized workflow definition β see your entire state machine at a glance:
π‘ See it live: BookingStateStatus.php γ» Booking.php γ» Docs
βοΈβοΈβοΈβοΈβοΈ Key Innovations
Laravel StateFlow provides enterprise features like automatic state discovery, rich UI metadata, built-in permissions, complete audit trails, and seamless Eloquent integration:
| Feature | β | Description | Example |
|---|---|---|---|
| Generate enum from states | β | Create workflow enum from existing state classes | php artisan stateflow:sync-enum γ» Docs |
| Automatic next states | β | Discover available transitions from current state | OrderController.php γ» Docs |
| UI metadata | β | Colors, icons, titles for frontend integration | Pending.php γ» Docs |
| Eloquent integration | β | Cast-based approach with clean, Laravel-native syntax | Order.php |
| Role-based permissions | β | Control transitions by user roles | Processing.php γ» Docs |
| Policy-based permissions | β | Use Laravel policies for transition authorization | OrderPolicy.php γ» Docs |
| State history & audit | β | Complete transition history with performer tracking | OrderController.php#show γ» Docs |
| API Resources | β | Ready-to-use JSON responses for states | Docs |
| Advanced query scopes | β | orderByState, countByState, averageTimeInState |
Docs |
| Silent transitions | β | Transition without firing events | Docs |
| Force transitions | β | Bypass validation for admin overrides | Docs |
| Fluent transition API | β | Clean, chainable API for transitions | Docs |
| Centralized enum transitions | β | Define state topology in a single enum for clarity | BookingStateStatus.php γ» Docs |
Installation
Publish the config (optional):
For history tracking, publish and run migrations:
Preparation in 4 simple Steps
1. Add State Column to Your Model
Add a state column to the model that will have state transitions. For example, if you have an Order model:
Note: Replace
orderswith your table name (e.g.,posts,invoices,tickets).
2. Create State Classes
Generate all state classes at once using the --states option:
This single command creates the base class and all extending state classes:
Alternative: You can also create states individually:
π‘ See the demo: The laravel-stateflow-demo uses this structure β see States/Order/ for a complete example.
β οΈ Important: Keep all state classes in the same directory as their base state class. When adding new states later, use the full namespace:
The
stateflow:sync-enumcommand only discovers states in the same directory as the base class.
3. Configure States
3.1 Traditional Approach β State Classes with Metadata
StateFlow supports multiple approaches for defining state metadata: Methods, Attributes, and Constants. The demo uses a combined approach β attributes for static metadata (title, description) and methods for dynamic values (color(), icon()).
π‘ See the demo: Pending.php and States/Order/
3.2 Hybrid Enum Approach β Centralized Workflow Topology
For teams who prefer seeing the entire workflow at a glance, use an enum to define the transition topology. State classes still handle behavior (colors, icons, metadata).
The Enum β Shows all transitions in one place:
State classes remain simple (behavior only, no transitions):
π‘ See the demo: BookingStateStatus.php and States/Booking/
π Learn more: See Defining States and Transitions for detailed comparison of all approaches.
4. Add to Model
4.1 Traditional Approach β Explicit Transitions
π‘ See the demo: Order.php
4.2 Hybrid Enum Approach β Clean & Elegant β¨
With the enum approach, your model becomes remarkably clean:
Benefits of the enum approach:
- β 3 lines instead of 10+ for state configuration
- β All transitions visible in one file (the enum)
- β Easy to generate workflow diagrams
- β Share workflows across multiple models
π‘ See the demo: Booking.php
π Learn more: See Defining States and Transitions for all approaches.
Optional: Generate Enum & History Tracking
Generate enum from existing state classes:
Naming Convention: By default, the command creates
{BaseStateClass}Status(e.g.,OrderStateβOrderStateStatus). Use--enum=App\Enums\YourCustomNameto specify a different name.β οΈ Directory Requirement: The sync command only discovers state classes in the same directory as the base state class. If you add new states later, ensure they are in the correct directory (e.g.,
app/States/Order/forOrderState).
Enable history tracking: Add ->recordHistory() to your StateConfig and use the HasStateHistory trait. See History Tracking.
How to use it
Basic Usage
π‘ Full Example: See the laravel-stateflow-demo for a complete implementation β Order.php (model), OrderController.php (controller), and States/Order/ (state classes).
Serializing States
States are stored in the database using their NAME constant value:
Tip: You can use class names (e.g.,
Processing::class) throughout your code - the package handles mapping to/from database values.
Listing Registered States
Retrieving Transitionable States
Using States in Blade Templates
Transitions
Basic Transition
With Metadata
Fluent API
Silent Transition (No Events)
Force Transition (Skip Validation)
Permissions
StateFlow provides flexible permission control through role-based and policy-based authorization. Control who can perform state transitions based on user roles, ownership, or complex business logic.
π Complete Permissions Documentation
Quick example:
History Tracking
Enable History
Query History
History Record
π‘ See it in action: The demo shows complete history tracking with a timeline UI β see OrderController.php for how history is queried and formatted.
API Resources
State Resource
In Controller
Query Scopes
Validation Rules
Events
Event Properties
Artisan Commands
π Key Feature: The
stateflow:sync-enumcommand scans your state directory and generates a workflow enum with all discovered states. This creates an enum withstateClasses(),canTransitionTo(), andtransitions()methods ready for use in your model'sregisterStates()method.
Configuration Reference
Common Patterns
Order Workflow
π‘ See this in action: The laravel-stateflow-demo demonstrates this workflow β see Order.php for the model and OrderController.php for the controller implementation.
Multiple State Fields
Custom Transition Logic
Register in config:
Dependency Injection in Transitions
The handle() method supports dependency injection via Laravel's container:
This allows for clean separation of concerns and easier testing through dependency mocking.
Version Compatibility
| Package Version | Laravel Versions | PHP Versions | Status |
|---|---|---|---|
| 1.x | 12.x | 8.3+ | Active support |
Note: The package is currently built for Laravel 12 with PHP 8.3+. Support for earlier Laravel versions may be added in future releases.
Credits
- Hamed Panjeh
- All Contributors
- Icon in the above image: Flow Chart by Bernd Lakenbrink from Noun Project (CC BY 3.0)
License
The MIT License (MIT). See License File for more information.