tilleuls/forgot-password-bundle
Tilleuls ForgotPasswordBundle is a Symfony bundle that adds secure forgot-password and password-reset flows: request a reset, email a token, validate it, and update credentials with configurable templates, events, and persistence.
Architecture fit — the headline issue is a category mismatch. Despite the brief framing this as a "Laravel/PHP package," tilleuls/forgot-password-bundle is a Symfony bundle, not a Laravel package. It ships a Bundle class, DI extension, YAML configuration tree, auto-registered routes, Doctrine entity mapping, and Symfony EventDispatcher hooks. Laravel has no bundle system, no services.yaml, no Doctrine-coupled routing convention. In a Laravel codebase this package cannot be installed and used as designed — it would have to be read as reference source and reimplemented. For a TPM, the first deliverable is correcting the assumption: this is a Symfony-platform asset only.
Scope fit (Symfony only). The bundle is deliberately thin and that is its main architectural virtue. It owns the token lifecycle and the two HTTP endpoints (POST /forgot-password/ to request a reset, POST /forgot-password/{token} to consume one) plus a persisted token entity. It explicitly does not send the email and does not change the password — both are delegated to event listeners you write. That is a clean separation: it composes with whatever mailer and user provider you already have, and it doesn't dictate password hashing. It is a scaffold, not a solution; budget for the listeners, the mail template, and the security hardening.
Technical risk.
Key questions for the vendor/repo owner before committing.
MakerBundle reset-password flow generates most of this into your repo, which removes the dependency entirely)?Stack fit. Strong in exactly one place: Symfony + Doctrine + a REST/JSON API, ideally alongside API Platform. There the bundle is near-zero-friction — install, configure the user class/email field/password field/token TTL, register routes, done. Fit in Laravel is effectively zero; there is no adapter path short of a rewrite.
Migration path. Two honest options:
Password::sendResetLink, Password::reset, the password_reset_tokens table, and queued ResetPassword notifications) already covers this feature natively, is maintained by the framework, handles token hashing and expiry, and carries zero third-party risk. Reimplementing a Symfony bundle inside Laravel is strictly worse than the framework feature you already have.Compatibility checks. Symfony LTS line, PHP minor version, Doctrine ORM 2 vs 3 (annotation vs attribute mapping), your mailer abstraction (Mailer vs SwiftMailer vs an external ESP), and whether your user entity satisfies the bundle's configured field expectations. Also confirm the route prefix won't collide with an existing /forgot-password in your API gateway.
Sequencing.
Maintenance. The runtime surface is small — two endpoints, one table, a handful of events — so the ongoing cost is dominated by your listeners, not by the bundle. The dependency-specific risk is upgrade drag: a thin bundle can lag Symfony major releases, and with 85 stars and no dependents you are likely among the first to hit a breakage. Assume you may need to fork and patch; keep the fork path cheap by not spreading its assumptions across the codebase.
Support. MIT, no commercial SLA, community support through GitHub issues only. Vendor credibility is good; responsiveness at this star count is unproven. Internal ownership must be assigned explicitly — "the bundle handles it" is not an owner.
Scaling. Effectively stateless HTTP plus a single token table, so it scales with the application tier. Two real constraints: (a) the token table needs an index on the token column and a periodic cleanup job, or it grows unbounded with abandoned reset attempts; (b) email delivery is the true bottleneck — it must be queued, not sent inline in the request, or a slow SMTP handshake becomes your p99 latency and a mail outage becomes a 500 on your login-adjacent endpoint.
Failure modes to design for.
Ramp-up. For a Symfony-fluent engineer: half a day to a day to wire, plus hardening time — the bundle's documentation is short and the events are self-explanatory. For a Laravel-only team: there is no ramp-up, only a rewrite, and the correct recommendation is to stop evaluating this package and use Laravel's native password broker instead. Either way, the TPM-level takeaway is the same: this package is a reasonable low-risk accelerator for one specific framework, and a poor fit for the one named in the request.
How can I help you explore Laravel packages today?