moukail/password-reset-mail-bundle
Password Reset Mail Bundle provides ready-to-use password reset email handling for PHP applications, helping you generate reset links and send them to users with minimal setup. Quickly integrate a complete password reset email flow into your app.
Architecture fit. The v1.0.6 release note — UserPasswordHasherInterface — resolves the open question from the prior assessment: this is a Symfony package, not Laravel. Symfony\Component\PasswordHasher\Hasher\UserPasswordHasherInterface is Symfony's password-hashing contract (introduced in Symfony 5.3, replacing UserPasswordEncoderInterface). So the "bundle" naming was correct all along, not a mislabel. That is a meaningful correction to the record, and it moves the package from "mislabeled and confused" to "coherent but out-of-scope for a Laravel shop." For Laravel, the architectural verdict is unchanged and now definitive: password reset is framework-owned (PasswordBroker, ResetPassword notification, signed URLs, token repository, throttling), and this package does not target that stack at all.
The use of a hasher interface is a mild positive design signal — it implies constructor injection and a testable seam rather than static calls. But it also implies the package writes a new password onto a user object, which means it is coupled to a user-entity contract (property access, an interface, or Doctrine). That coupling is the thing a TPM needs documented and almost certainly isn't.
Integration feasibility. For a Laravel application: zero. Not "low" — the package targets a different framework. For a Symfony application: feasible in principle, but the competitive picture is worse than the Laravel one. Symfony's de facto standard for this feature is symfonycasts/reset-password-bundle, which is widely installed, documented, and maintained by the Symfony education channel. A zero-star package reimplementing a flow that already has a community standard plus first-party MakerBundle scaffolding is in a weak position regardless of framework. The v1.0.6 note tells us nothing about install base, docs, or tests.
Technical risk. Revised but still high:
Key questions to resolve before any further evaluation:
composer.json declare — does it reach 6.x/7.x, or stop at 5.x?symfonycasts/reset-password-bundle, which is the incumbent? If nothing material, the build-vs-buy argument collapses.Stack fit. For a Laravel application, the answer is now unambiguous rather than judgment-based: the package is not built for this stack and should not appear in a Laravel dependency graph at all. Use the framework's native Password broker; if the driver is custom email branding, implement it as a Notification and published mail view. For a Symfony application, the package is idiomatically at home, but the correct first comparison is against symfonycasts/reset-password-bundle, not against a blank page. Only if that comparison shows a real gap does this package warrant a source audit.
Migration path. Unchanged for Laravel — the path, if anyone is on it, is off it: inventory behavior, rebuild on the native broker with a custom ResetPassword notification, keep default token lifetime and throttling, then delete the dependency and its provider registration. For a Symfony shop, the path is a comparison exercise rather than a migration: map current behavior (token storage, lifetime, mail template, hasher wiring) against both this package and the SymfonyCasts bundle, then choose. Because v1.0.6 touches hashing, any Symfony adopter already on this package should confirm whether rehashing behavior changed before their next release.
Compatibility. Unknown and now the binding constraint. The hasher interface establishes a Symfony 5.3 floor, which is good, but a floor is not a ceiling — Symfony 6 and 7 compatibility is unverified. PHP version constraints are unverified. For Laravel, compatibility is moot: symfony/* requirements in a Laravel app mean Composer resolution failure or a dependency you cannot justify. Do not treat --ignore-platform-reqs as a compatibility answer.
Sequencing.
composer.json — confirm symfony/* requires and the declared version range. This is now a five-minute check, not a research project.symfonycasts/reset-password-bundle first, then audit source for token generation, hashing, and mail handling only if the comparison justifies it.Maintenance. Revised upward from "effectively unmaintained" to "thinly maintained, unverifiable." Six patch releases is better than one, and the move to UserPasswordHasherInterface suggests someone is tracking Symfony deprecations. That is a genuine improvement over the prior read and should be recorded as such. But there is still no changelog, no upgrade guide, no visible backlog, and no security policy. Any bug becomes the adopter's to fix in a fork. For a Laravel shop this is irrelevant — the framework maintains the feature for free.
Support. Unchanged. No community footprint, no triage, no advisories, no Stack Overflow corpus. In Symfony the support answer is different in kind: the community-supported route is the SymfonyCasts bundle, which has documentation and an issue tracker. Choosing the thinner package in a space where a supported option exists trades a known quantity for an unknown one during an auth incident.
Scaling. Functionally trivial workload — send mail, validate token, hash password. The scaling risk is organizational and unchanged: every service depending on this package widens the blast radius of an unpatched vulnerability and complicates the next major-framework upgrade. A v1.0.6 that silently changes hashing wiring is exactly the kind of change that surfaces across many services at once, with no changelog to explain it.
Failure modes to plan for.
Ramp-up. Still "read the source," because the six-word release note is representative of the project's documentation posture. That cost remains avoidable in both stacks: Laravel engineers should ramp on the native Password broker and notifications; Symfony engineers should ramp on symfonycasts/reset-password-bundle, which has first-party-style docs. The v1.0.6 note reduces the "is this abandoned?" concern but does nothing to reduce onboarding cost.
Recommendation. Do not adopt for Laravel — the package targets Symfony, so this is now a scope exclusion rather than a risk judgment. For Symfony, treat it as a fallback candidate only: benchmark it against symfonycasts/reset-password-bundle, and if it wins on a documented, specific requirement, adopt it under fork-and-own terms with a named owner and a security review. In both cases, confirm the underlying business requirement first — it is almost certainly custom email presentation, which is a first-party template concern, not a reason to take on a dependency in the authentication path.
How can I help you explore Laravel packages today?