Weave Code
Weaver
Helps Laravel developers discover, compare, and choose open-source packages. See popularity, security, maintainers, and scores at a glance to make better decisions.
Feedback
Share your thoughts, report bugs, or suggest improvements.
Subject
Message

Forgot Password Bundle Laravel Package

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.

View on GitHub
Deep Wiki
Context7

Technical Evaluation

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.

  • Adoption signal is weak: 85 stars and zero dependents. Low dependents is not proof of poor quality (the vendor, Les-Tilleuls.coop, are the API Platform authors and credible), but it means almost no field-tested integration paths, few Stack Overflow answers, and a small issue backlog to learn from.
  • Release metadata is unreliable: the "last release 2026-04-10" is a future date relative to any sane reading — treat the versioning/cadence signal as unverified and confirm the actual tag history directly.
  • Single-vendor, low bus factor. Abandonment risk is real; mitigate by assuming you may vendor the ~a few hundred lines and own them.
  • Security-sensitive surface with intentionally minimal defaults. Token generation strength, TTL, single-use semantics, user-enumeration resistance (uniform responses and timing whether or not the email exists), and rate limiting are your responsibility. A bundle that quietly returns different responses for known vs. unknown emails is a finding in your security review, not a bug they'll fix.
  • Doctrine coupling constrains you: multi-entity-manager setups, non-Doctrine persistence, or ORM 3 attribute/annotation migration all need checking.

Key questions for the vendor/repo owner before committing.

  1. Which framework are we actually standardizing on? If Laravel, this evaluation ends here.
  2. If Symfony: which LTS versions and PHP versions are in the support matrix, and is Doctrine ORM 3 supported?
  3. What is the real commit cadence and issue-response time over the last 12 months (not the release field)?
  4. Does the bundle hash tokens at rest, or store them in plaintext in the DB?
  5. Is there a maintained fork or a first-party alternative we should compare (Symfony's own MakerBundle reset-password flow generates most of this into your repo, which removes the dependency entirely)?

Integration Approach

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:

  • Symfony greenfield: install and configure; no migration, one config block plus two listeners.
  • Symfony brownfield with an existing reset flow: run the bundle in parallel behind a feature flag, dual-write nothing (it's additive — a new token table), and cut over the UI once the new endpoints are exercised in staging.
  • Laravel (any state): do not migrate. Laravel's built-in password broker (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.

  1. Confirm framework decision — this gates everything.
  2. Timebox a spike (≤1 day) installing the bundle in a branch against a test user, to validate the version matrix empirically.
  3. Implement the listeners: send-email (queued), apply-new-password (delegate to your hasher), and an audit-log listener.
  4. Harden: rate limiting per IP and per email, uniform response bodies and timings for known/unknown accounts, single-use token invalidation on success, hashed token storage, and a scheduled purge for expired rows.
  5. Security review and load test before GA; then decide whether to keep the dependency or inline the code.

Operational Impact

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.

  • Mail provider outage → user has a token they never received; token expires silently and the user retries into rate limits.
  • Token not invalidated on successful reset → replay window; depends entirely on your listener.
  • Enumeration leak via differing status codes, bodies, or response timing for registered vs. unregistered emails.
  • Clock skew or timezone handling on TTL producing "valid token rejected" reports.
  • Misconfigured user provider or field mapping → 500s that surface as "password reset is broken" with no obvious cause.
  • Concurrency: two simultaneous reset requests for one account; define whether the older token is invalidated.
  • Silent failure if the event listener throws and the exception is swallowed — the API returns 200 while no email is sent.

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.

Weaver

How can I help you explore Laravel packages today?

Conversation history is not saved when not logged in.
Prompt
Add packages to context
No packages found.
ippanelcom/laravel-sdk
adachsoft/changelog-linter
adachsoft/collection
payerurl/telegrambot-crypto-payment-instant-payout
dskripchenko/laravel-hybrid-search
riorizkyrainey/lara-ced
mehedimi/static-vel
zharp/zharp
nonsapiens/bigquery-model-sync
lgu-bayambang-ict-office/lgu-laravel-development-standards
andydefer/laravel-support
se7enxweb/flysystem
lampwick/laravel
jeslage/statamic-emojis
micahdshackelford/rmap-laravel
draftsmaninc/draftsman
square-bit/laravel-volition
himito/laravel-mailman
htinlynn/genius-helper
maco-studios/hephaestus