free-agent/workflow-bundle
Free Agent's Workflow Bundle brings structured workflow management to PHP applications. Define multi-step processes, manage transitions, and track state in one lightweight package. A practical choice for projects needing simple, configurable workflow orchestration.
Architecture fit: Poor — hard mismatch. free-agent/workflow-bundle is a Symfony2 bundle, not a framework-agnostic library. It is designed to be registered in a Symfony Kernel, configured through Symfony's Configuration/Extension tree, and wired into the Symfony DI container and EventDispatcher. Laravel has no bundle concept; its equivalents are service providers, the Illuminate container, and its own event system. There is no drop-in path — at minimum the workflow engine would need to be extracted from the bundle's DI/config layer and re-hosted inside a Laravel service provider, assuming the core state-machine classes are even decoupled enough to allow it.
Integration feasibility: Low. Composer will install the package, but composer require succeeding is not the same as the code loading. The bundle's service definitions assume Symfony 2.x component versions, which will conflict with the Symfony 6/7 components that Laravel 10/11 pull in transitively. Expect dependency-resolution failures or, worse, a successful install followed by runtime container errors. A realistic effort estimate for an adapter spike is 2–4 engineering days just to determine whether the workflow core is reusable — with a likely negative answer.
Technical risk: High and largely unmitigable.
Key questions for the requesting team:
symfony/workflow (standalone, maintained) or spatie/laravel-model-states covers the need.Stack fit: Not viable as-is. There is no reasonable configuration in which a Symfony2 bundle is a natural citizen of a Laravel application. The correct framing is not "how do we integrate this" but "what workflow capability do we need, and what is the best-maintained vehicle for it in Laravel."
Recommended migration path: replace, don't port.
symfony/workflow component standalone. It is the maintained successor to the ideas in this bundle, is framework-agnostic by design, ships with modern PHP support, and can be bound into Laravel via a thin service provider that registers the Workflow/MarkingStore factories. This preserves the conceptual model the requester likely wants while dropping the dead Symfony2 packaging.spatie/laravel-model-states if the requirement is per-model state with typed transitions and authorization hooks, which is the common Laravel shape of this problem.Compatibility: Assume incompatible until proven otherwise. The concrete blocker is Symfony 2.x component version constraints against the Symfony 6/7 components resolved by a current Laravel install. Even a --ignore-platform-reqs install leaves you with code written against APIs that have since changed (EventDispatcher signatures, container compilation passes, configuration tree builders). PHP 8.x deprecations and type changes are a second, independent blocker.
Sequencing:
symfony/workflow, spatie/laravel-model-states, and build-your-own.WorkflowEngine contract) so a future swap is cheap. This interface is the real deliverable; the specific library behind it is an implementation detail.Maintenance: Total ownership, indefinitely. An archived package means the adopting team becomes the de facto maintainer from day one. Every PHP minor upgrade, every Laravel major upgrade, and every CVE in a transitive dependency is yours to resolve. There is no upstream to file against. This is the single largest cost and it does not appear on the project plan unless someone puts it there.
Support: Effectively none. 0 dependents and 2 stars means no production corpus to learn from, no issue history to search, no maintainer to ask, and almost certainly no documentation beyond a README and the source. Troubleshooting is source-reading by whoever is on call — and the call will come at an inconvenient time.
Scaling: Not the bottleneck, but not the concern. A workflow engine is not a throughput constraint at any realistic scale; the risk is entirely in correctness under load and under concurrent transitions. If the bundle's marking store is database-backed, verify row-level locking and optimistic-concurrency behavior explicitly before trusting it with concurrent transition attempts. An unmaintained engine with untested concurrency semantics is a class of bug that surfaces only in production.
Failure modes, in rough order of likelihood:
Ramp-up: Deceptively easy, then steep. The bundle is small and a competent engineer will read it in an afternoon — that low initial friction is exactly what makes adoption tempting and what makes the eventual maintenance cliff surprising. The real ramp-up cost is organizational: onboarding new engineers onto a bespoke, undocumented Symfony2-in-Laravel shim, and the recurring tax at every upgrade cycle.
Bottom line for the decision meeting: do not adopt. The package is archived, has no user base, targets a framework the organization does not run, and sits on a dependency line that conflicts with the current stack. The workflow need is real and worth solving; this is not the vehicle. Approve a two-day spike to confirm the incompatibility, then fund implementation on symfony/workflow or spatie/laravel-model-states behind an internal interface. Expected saving versus an adapter-plus-forever-fork path: roughly 1–2 weeks of initial engineering and an unbounded, unowned maintenance liability.
How can I help you explore Laravel packages today?