eo/redirect-bundle
EoRedirectBundle is a Symfony 2.1+ bundle for handling redirects, installable via Composer and enabled in AppKernel. It is released under the MIT license, with issues and feature requests tracked on GitHub.
Architecture fit — hard mismatch on the stated platform. eo/redirect-bundle is a Symfony 2.1+ bundle (EoRedirectBundle, registered in AppKernel::registerBundles(), distributed via Composer under vendor/eo). The intake record classifies it as a Laravel/PHP package; it is not. Laravel exposes no bundle registry, no AppKernel, no Symfony DI extension contract, and a different HTTP kernel/event model. There is no service provider, no publishable config, no migration set. From a TPM standpoint, this is a scheduling hazard before it is a technical one: any spike, ticket, or story written against "integrate the package" is work that cannot succeed, and the fastest lever a TPM has here is to correct the intake record and close the story line rather than let engineering discover the mismatch mid-sprint.
Integration feasibility — zero for direct installation; high for informed reimplementation. The bundle's useful surface is small and well understood: a redirect entity (source path → target path, status code) plus a request or exception listener that short-circuits and emits a redirect response. That is a bounded, low-uncertainty build in Laravel — one migration, one Eloquent model, one global middleware, one admin CRUD screen, plus tests. A TPM should model this as a single small, well-estimated work package with no external dependency, which is exactly the profile that makes it a poor candidate for a third-party dependency in the first place. The package's real contribution is as a design reference, not a line item in composer.json.
Technical risk — high and concentrated in areas a TPM owns.
"eo/redirect-bundle": "dev-master". No semver tags means builds are not reproducible and composer update can change production behavior without a reviewable diff — a supply-chain and change-management exposure.Key questions for discovery (resolve before any commitment or estimation):
Stack fit — no viable path. Laravel's equivalents are a service provider, middleware registered in bootstrap/app.php (or Kernel.php on older versions), and a migration-backed Eloquent model. None of these map onto the bundle's EoRedirectBundle + DI-extension pattern. A "port" would mean standing up Symfony kernel and event-dispatcher abstractions inside Laravel to support a redirect table — disproportionate cost with permanent maintenance drag. A TPM should not sequence a port; sequence a build.
Recommended path — first-party module, delivered as one work package.
redirects (id, source_path unique + indexed, target_url, status_code default 301, is_active, hit_count, last_hit_at, timestamps).redirect()->to($target, $status) on a match, passing through otherwise. Registered ahead of the router.redirect_candidates for editorial triage — this is where the SEO value actually compounds.Migration path (only if a prior system holds real data). If a legacy Symfony service holds a populated redirect table, extract to CSV (source, target, status) and import behind a validation gate that deduplicates sources, collapses chains (A→B, B→C ⇒ A→C), rejects self-referential entries, and confirms every target is a relative path or an allowlisted domain. Assign this to whoever owns the legacy service; it is a cross-team dependency and belongs on the dependency list, not buried in the build estimate.
Compatibility checks. If a legacy Symfony app must remain on the bundle temporarily, pin to a commit hash rather than dev-master, verify the installed PHP version against the bundle's implicit 5.3/5.4-era assumptions, and confirm Doctrine ORM version compatibility. Record the pin and the EOL framework as an audit finding with a migration line item.
Sequencing.
Maintenance. Effectively unmaintained and unmaintainable by us. No releases, no changelog, no tests, one maintainer, zero downstream users to surface defects. Every bug becomes our bug with no upstream remediation path and no upgrade history to learn from. The first-party alternative is roughly 200 lines that stay inside our own support boundary, which is a materially better operational posture — and a TPM should say so plainly rather than treating "maintained by someone else" as free.
Support. No documentation beyond composer install steps, no community footprint at 0 stars, no Stack Overflow surface. Internal onboarding requires reading vendor source. This typically disqualifies a package in a dependency review on its own; at this functional size there is no offsetting benefit.
Scaling. The design is unknown, and the naive shape — a database lookup resolved on every request — is a per-request latency tax that becomes material at high RPS. Mandate in any implementation: cache the full redirect map in Redis/APCu with short TTL and explicit invalidation on write; resolve on 404 only where the requirement allows; keep lookup O(1) via a unique index on source_path; and record hit counters asynchronously so writes never sit in the request path. These are acceptance criteria, not optimizations to defer.
Failure modes to design and monitor against.
dev-master resolving to new code on an unrelated composer update, with no changelog to explain the change.Ramp-up. For this package, near zero and not worth investing in — no docs to absorb, no community to join, and the framework idioms predate modern PHP. For the recommended build, ramp-up is on the order of a day for a mid-level engineer already fluent in Laravel middleware and Eloquent, plus an hour of editorial training on the admin screen. The asymmetry is the point: the in-house path has a lower ramp-up cost than adopting the dependency, which is the clearest signal that the dependency has no leverage here.
Program-level recommendation. Record eo/redirect-bundle as a rejected candidate with reasons (platform mismatch, unstable version constraint, zero community validation, EOL framework, SEO-critical path with no correctness guarantees). Treat redirect management as an owned capability with a named owner, tests, and monitoring. Use this as the worked example when codifying the internal adoption bar — pinned releases, tests, active maintainer, license check, security disclosure path — so the next similarly-mismatched intake is filtered before it reaches an engineering calendar.
How can I help you explore Laravel packages today?