idci/extra-step-bundle
Symfony bundle for adding configurable extra steps to existing multi-step workflows. It provides services, routing, and templates to insert additional screens into forms, checkout, or other processes while preserving step order and state, extending flows without rewriting core logic.
Architecture fit: the premise doesn't hold. This package is a Symfony2 bundle, not a Laravel package. It ships as a Symfony\Component\HttpKernel\Bundle\Bundle, is discovered by the Symfony kernel's bundle registry, and is configured through a Symfony DependencyInjection extension. Laravel has no analog — auto-discovery reads extra.laravel and service providers, and a Symfony bundle exposes neither. It also is not standalone: it expands idci/step-bundle, so the pair must be evaluated together, and the base bundle's undocumented API governs everything.
What is genuinely transferable is the design pattern: a step registry plus a dynamic path resolver that computes the next step at runtime from user input, with navigation and state transitions handled outside the controller. That pattern is the actual product asset. The code is not.
Integration feasibility: near-zero as a dependency, moderate as a reference. Faithful adoption requires standing up a Symfony 2.x skeleton (EOL since November 2018). Porting the abstractions into Laravel is a rewrite of the integration layer, not an integration: DI container tag compilation for step registration, the Symfony EventDispatcher for transitions, HTTP-kernel controller resolution, and routing conventions are all framework-specific. Realistically we would reuse the conceptual model and some plain-PHP value objects, and rebuild everything else.
Technical risk: high, on multiple independent axes.
each(), create_function, old DI loaders, legacy PHPUnit constraints).symfony/* ^2.x, which will hard-conflict with Laravel 9+/Symfony 6/7 constraints. Expect Composer resolution to fail before a single line of code runs, with --ignore-platform-reqs as the only workaround — itself an operational liability.Key questions to resolve before any further spend.
idci/step-bundle documented anywhere, or must its API be reverse-engineered from source?Absent a compelling answer to (1) and (2), the recommendation is reject-and-substitute.
Stack fit. Against our Laravel estate: none. No bundle loader, no kernel, no tag compiler, no auto-discovery hook. Against Symfony: only the 2.x/3.x band, which is itself EOL — so even the "native" path targets an unsupported platform. The only modern-fit option in the same problem space is the Symfony Workflow component (framework-agnostic, Composer-installable inside Laravel) or a maintained Laravel-native state machine.
Migration path — ranked.
Compatibility. Bundle registration requires the Symfony kernel; nothing in Laravel reads it. The idci/step-bundle pin drags the graph to legacy Symfony/PHP, which conflicts with current framework constraints. Any Laravel port must also redesign persistence from Doctrine ORM entities onto Eloquent, and add a cache layer over step resolution — the original has neither in a form we can reuse.
Sequencing. Gate behind a timeboxed spike of one to two weeks: confirm the step-bundle API surface from source, confirm license and platform constraints, and return a port estimate plus a substitute-vs-port recommendation. Run the spike before allocating any roadmap slot, and do not sequence it as a dependency for downstream work — plan on the substitution outcome so other teams are not blocked by it. If the spike is not funded, close the question now.
Maintenance. Worst-case profile: abandoned upstream means every bug fix, security patch, and PHP-version compatibility change becomes ours. A fork implies pinned dependencies, an internal CI pipeline, a documented upgrade path, and a named owner — recurring cost disproportionate to a package with no external users or validation.
Support. No vendor SLA, no forum, no advisory feed; escalation is reading the source. Single-vendor provenance compounds continuity risk — if the repo is archived, the fork is the only artifact and institutional knowledge leaves with whoever built it.
Scaling. In the Symfony2 idiom, workflow state lives in Doctrine ORM entities, so throughput is bounded by the database and by how often step resolution queries it. Runtime path generation is the natural hotspot: resolving the path on every request without caching will surface first under load. Any port must consciously redesign persistence onto Eloquent and cache resolved paths per flow-definition version.
Failure modes to instrument for.
Ramp-up. Steep relative to package size: the team must absorb Symfony2 bundle idioms (kernel registration, compiler passes, tagged services) and reverse-engineer undocumented step-bundle contracts from source. Documentation is sparse to absent. Realistic budget: one to two engineer-weeks to fluency for a senior PHP engineer before any port work begins — hard to justify against substituting a documented, maintained component.
Decision requested. Approve the pattern (step registry + dynamic path resolver) as a design input; decline the package as a dependency in any form; fund the one-to-two-week spike only if a concrete sponsored use case exists; and confirm which team owns a shared flow engine if the roadmap contains more than one branching flow. Bottom line: preserve the requirement, not the package — document this as a substitution decision, not an open integration backlog item.
How can I help you explore Laravel packages today?