imaximius/forgot-password-bundle
A PHP bundle that adds a complete forgot-password flow: request reset links, generate and validate secure tokens, send reset emails, and update passwords. Configurable templates and storage make it easy to integrate into existing applications.
Headline finding: This is not a Laravel package. The repository (CoopTilleulsForgotPasswordBundle, republished under the imaximius vendor namespace) is a Symfony2 bundle. Its architecture is built around Symfony's Bundle class, DependencyInjection extension, EventDispatcher, Symfony routing (YAML/XML), and — in most versions — Doctrine ORM mappings. None of these primitives have equivalents that Laravel can consume.
Architecture fit — poor. A Symfony bundle's entry point is AcmeBundle::class registered in AppKernel/bundles.php. Laravel's equivalent is a Service Provider with register()/boot(), package auto-discovery via composer.json extra.laravel, and container bindings against Laravel contracts (Illuminate\Contracts\Auth\PasswordBroker, CanResetPassword, Illuminate\Notifications\Notifiable). There is no adapter layer, no bridge package, and no realistic path to "install and configure." Using this from Laravel means rewriting it.
Integration feasibility — low, and the effort is misrepresented by the package name. A faithful port requires re-implementing at minimum:
| Symfony artifact | Laravel equivalent that must be written |
|---|---|
Bundle + DI Extension + Configuration tree |
Service Provider + config/password_reset.php |
| Doctrine entity/repository for reset tokens | Eloquent model + migration + expiry index |
| Symfony Mailer / Swiftmailer templates | Notification / Mailable |
| Symfony routing + controllers | routes/api.php + controller or actions |
| Symfony event subscribers | Laravel events/listeners |
| Token generator service | Keep or replace with Laravel's PasswordBroker |
At that point you have written the feature; the bundle contributed design inspiration only.
Technical risk — high, and concentrated in a security-critical surface. Password reset is a high-severity feature: token entropy, single-use enforcement, TTL and clock handling, account-enumeration-resistant responses, rate limiting, and email-link host validation. Every one of those is a potential vulnerability if inherited from an unmaintained source. The health signals are uniformly negative:
imaximius republication of a CoopTilleuls codebase with no stated diff. You cannot tell what was changed or why. That is a supply-chain question you should not have to ask about authentication code.Key questions to resolve before any further evaluation:
coopTilleuls/forgot-password-bundle? What patch does the fork carry, and is that patch still needed?composer.json declare, and do they resolve against our runtime?imaximius namespace, and is there any commitment to security response?Stack fit — none for Laravel. Laravel ships this feature in core: the Illuminate\Auth\Passwords broker, the CanResetPassword contract, Password::sendResetLink() / Password::reset(), the password_reset_tokens table, and signed, expiring notification URLs. It is maintained by the framework team, covered by the security release process, and already installed. Evaluating a third-party Symfony bundle to supply it is a net-negative trade.
Recommended migration path — do not port; replace. If the goal is to reuse the bundle's behavior (configurable token TTL, throttling, email delivery, single-use reset), express those requirements as acceptance criteria against Laravel's native broker and configure them:
config/auth.php passwords.users.expire / .throttle.password_reset_tokens migration (add a prune job for expired rows).ResetPassword notification; queue it.throttle middleware.PasswordResetLinkSent / PasswordReset for audit logging.Estimated effort: hours, versus days-to-weeks for a bundle port with equivalent test coverage.
Compatibility. Expect PHP 7.x-era constraints and Symfony 4/5 APIs from a January 2021 release. Laravel 10/11 run on PHP 8.1+ with stricter typing and no Symfony bundle loader; the package will not autoload into a Laravel app, and composer require will either fail dependency resolution or install dead code.
Sequencing, if the requirement genuinely demands this codebase:
coopTilleuls first; only fall back to this fork if it carries a specific, documented patch we need.Maintenance — assume unmaintained. A single namespace, no release in four years, no stars, no dependents. There is no upgrade path to PHP 8.3+, no Symfony 7 support, and no expectation of a security patch. If adopted, it becomes permanently our fork to maintain — including re-reviewing the authentication logic ourselves, which defeats the purpose of using a package.
Support — effectively zero. No maintainer SLA, no issue triage, no documentation beyond the upstream README, no community to escalate to. The escalation path is our own on-call engineer reading unfamiliar Symfony idiom during an incident. For a login-path feature, that is the wrong support model.
Scaling — not the constraint. Password reset is low-volume with bursty peaks (credential-stuffing waves, post-outage retries). The token table grows monotonically and needs a scheduled prune plus an index on created_at/email; unpruned tables degrade quietly over quarters. The real capacity dependency is the mail provider, not this code. The scaling concern that does matter is abuse: without per-account and per-IP throttling, the endpoint becomes a free email-bombing relay and an enumeration oracle.
Failure modes to plan for:
Ramp-up — negative value. There is no durable skill to build here. Learning Symfony bundle conventions inside a Laravel team is spent effort with no reuse, and the codebase is too small to justify a knowledge-transfer session. For a Symfony team, wiring the upstream bundle is roughly a day of config and route work — but that team should be evaluating upstream, not this fork.
TPM recommendation: Close as rejected — framework mismatch plus abandonment risk on a security-critical path. Re-scope the requirement against Laravel's native password broker; if a Symfony target surfaces later, re-open against the upstream coopTilleuls package with a maintainer and version-support check.
How can I help you explore Laravel packages today?