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

Rate Limit Bundle Laravel Package

fusonic/rate-limit-bundle

A Symfony bundle for declarative rate limiting. Apply attributes to controllers and services, configure limits and intervals, and use flexible storage backends to throttle APIs and protect actions with minimal setup and clean Symfony integration.

View on GitHub
Deep Wiki
Context7

Technical Evaluation

Bottom line: still a no-go on adoption. v4.0.0 ("Compatibility with PHP 8") removes one previously disqualifying obstacle — the near-certain Composer constraint collision on PHP 8.1+/Laravel 10–11 — but it does not touch any of the gates that actually decided the outcome. The package remains a Symfony bundle, not a Laravel package; it still has zero stars, zero dependents, and no support surface; and Laravel still ships a first-party equivalent (Illuminate\Cache\RateLimiter + throttle middleware) that is maintained with the framework. A PHP-version bump does not convert a foreign-ecosystem artifact into a viable Laravel dependency. The redirect to native throttling stands.

What the release changes, precisely. One claim: PHP 8 compatibility, shipped as a major version bump. That is a narrow, real improvement to the dependency-resolution risk and nothing else. It does not change the kernel/DI/bundle-model mismatch, the ecosystem abandonment, the value proposition, or the security-response posture. It is also a major-version bump accompanied by a one-line changelog with no enumerated breaking changes, no upgrade guide, and no stated PHP minor-version matrix — which is its own signal about release engineering discipline, not a reassurance.

Architecture fit — poor (still fails at the first gate).

  • The package targets Symfony's kernel/DI/bundle model: it registers services via a bundle class, consumes Symfony's RateLimiter component and cache pools, and hooks route metadata through Symfony's routing/event system. Nothing about a PHP 8 compatibility release changes this. Laravel has no bundle registration and a fundamentally different HTTP kernel and middleware pipeline.
  • Laravel already ships the equivalent capability: the throttle middleware backed by Illuminate\Cache\RateLimiter, configured in RouteServiceProvider/AppServiceProvider with RateLimiter::for(). The package's value proposition — "simple rate limiting based on routes" — is already native, declarative, and testable in Laravel.
  • PHP 8 support makes the package installable; it does not make it architecturally coherent in a Laravel app. Installability was never the binding constraint — the missing capability was.

Integration feasibility — low (revised: blocked later, not at step zero).

  • Previously composer require was expected to fail on constraint resolution before any code was written. That specific blocker is now plausibly cleared for PHP 8.0-era constraints. Verify, do not assume: "PHP 8" is unspecific — confirm support for the PHP minors we actually run (8.2/8.3), confirm the transitive Symfony 5.x-era constraints resolve against a Laravel 10–11 graph, and confirm it installs cleanly alongside laravel/framework without pinning our framework or cache packages.
  • The real work is unchanged: pulling symfony/rate-limiter and framework-bundle-adjacent contracts into a Laravel app, bootstrapping Symfony services alongside the Laravel container, and bridging route metadata. That is still a multi-sprint adapter project to reach parity with a one-line ->middleware('throttle:60,1').
  • Zero dependents means still no reference implementations, no community integration patterns, and no downstream bug reports to learn from. A v4.0.0 with no adopters tells us nothing about whether the upgrade path works in practice.
  • Migration cost asymmetry: adopting now means we take on a v4.x major with undocumented breaking changes from v3.x, on a package with no user base to have stress-tested that jump.

Technical risk — high (unchanged in aggregate).

  • Maintenance status must be re-verified. The prior assessment recorded the repository as archived. A published release implies either the archive was lifted or releases are still being cut from an archived repo. Neither is reassuring on its own. Confirm: is the repo unarchived, who has commit rights, is there a security disclosure policy, and what is the stated support horizon for v4? A single revival commit is not a maintenance commitment.
  • Security-adjacent surface: rate limiting is a control-plane defence (credential stuffing, scraping, abuse, cost containment). Shipping a barely-maintained component on that path remains a standing audit and incident-response liability. A PHP-version bump is not a security-response process.
  • Supply chain: zero dependents and (presumably) a single maintainer mean no CVE watch, no downstream detection, and no upgrade cadence we can rely on. A revival release slightly increases the risk of us being the only party to exercise the code path.
  • Release hygiene: a major version with a one-line note and no changelog detail is a low-maturity signal on the exact axis — predictable, reviewable change — that we'd depend on for a security-relevant dependency.
  • Opportunity cost: unchanged. Adapter engineering is time not spent on correctly tuned native limits.
  • Qualitative read stands: this is an artifact with no adoption, not a candidate. The release does not move the composite score in any material way.

Key questions (to close before any further evaluation).

  1. Release interrogation: who published v4.0.0, was the repository unarchived, what exactly broke between v3.x and v4.0.0, which PHP minors are supported, and is there a published support/security policy? Any "unknown" here is a stop.
  2. Is there any requirement the native throttle middleware genuinely cannot satisfy (per-tenant keys, cost-weighted limits, distributed counters)? If yes, we solve it with a first-party implementation, not this bundle.
  3. Are we running any Symfony services where this bundle could be the right tool? If so, evaluate it there — but note Symfony has shipped rate limiting in symfony/rate-limiter since 5.2, which likely supersedes this bundle even in its own ecosystem.
  4. What is the actual control objective — abuse mitigation, cost protection, fair-use tiers, or SLA enforcement? The answer determines the limiter design, and none of them require this package.
  5. Who owns the decision if we adopt a low-adoption dependency on a security-relevant path? We should not proceed without a named owner accepting that risk in writing.
  6. Is there a compliance or audit requirement that mandates a maintained, patched dependency for request-throttling controls? If so, this package is disqualified outright — and a one-line PHP 8 release does not satisfy "maintained."

Integration Approach

Stack fit — not applicable / redirect (unchanged by v4.0.0). The package still does not fit a Laravel/PHP application stack. The recommended integration remains Laravel's native rate limiting: first-party, maintained with the framework, already present in every Laravel install. There is nothing to install, and v4.0.0 does not create anything to install.

Recommended target architecture.

  • Limiter definitions in AppServiceProvider::boot() via RateLimiter::for('api', fn (Request $r) => Limit::perMinute(60)->by($r->user()?->id ?: $r->ip())) — named limiters keyed by user, IP, tenant, or API key, with cost weighting via ->response() and ->withHeaders().
  • Route binding through the throttle:<name> middleware on route groups, mirroring the route-based ergonomics the Symfony bundle advertises — without the foreign dependency.
  • Store using Redis (cache store redis) for multi-node deployments; array store for tests; database store only if Redis is unavailable and volume is low.
  • Observability by emitting RateLimitHit/RateLimitExceeded events into existing logging/metrics rather than relying on package internals.

Migration path (if any Symfony-era config exists to port).

  1. Inventory every route/endpoint currently governed by the bundle (or by hand-rolled counters) with its limit, window, and key.
  2. Re-express each as a named RateLimiter::for() definition in AppServiceProvider.
  3. Attach throttle:<name> middleware to route groups; remove the Symfony service wiring and Composer dependency in the same PR.
  4. Add a header assertion test (X-RateLimit-Limit, X-RateLimit-Remaining, Retry-After) so behaviour is pinned at the HTTP contract level.

Compatibility.

  • Native throttling is versioned with Laravel (10.x, 11.x) and PHP 8.1+, with documented upgrade guides — the inverse of the package's history: a 2020 freeze followed by a single unspecific PHP 8 note in v4.0.0.
  • No Symfony contracts, no divergent DI container, no dependency-resolution conflicts, no undocumented major-version jump.

Sequencing.

  1. Week 0: Decision record — reject fusonic/rate-limit-bundle including v4.0.0, adopt native throttle; record the v4.0.0 review as "does not change the decision"; identify the abuse/cost objective per endpoint.
  2. Week 1: Define named limiters and keys; land with tests; add headers and metrics.
  3. Week 2: Roll out route-group by route-group behind a feature flag; back-out path is a middleware removal, not a dependency rollback.
  4. Week 3: Tune thresholds against real traffic; document the limits in the API contract; add alerting on 429 rate.

If a Symfony service does exist in the estate: evaluate symfony/rate-limiter directly (framework-native since 5.2) rather than this bundle — and note that v4.0.0's PHP 8 claim is equally unverified there.

Operational Impact

Maintenance — still the decisive factor. A single PHP 8 compatibility release does not constitute a maintenance programme. It tells us someone touched the build once; it does not tell us who triages issues, how security reports are handled, or whether a PHP 8.3/8.4 release will follow. If we adopt, we must still assume we own the entire artifact the moment it breaks: fork it, patch it, carry it indefinitely — a permanent tax for zero incremental capability. The native alternative's maintenance is carried by the Laravel release train we already track.

Support.

  • Package: no demonstrated maintainer support model, no issue-triage evidence, no security disclosure process, zero dependents meaning no community answers and no Stack Overflow footprint. v4.0.0 adds an unenumerated breaking-change set to the archaeology. Every incident becomes internal R&D.
  • Native: Laravel docs, upgrade guides, LTS cadence, and a broad hiring pool that already knows the throttle middleware — relevant for onboarding and on-call.

Scaling.

  • The bundle's counters depend on Symfony cache pools; scaling to N app nodes requires a shared store, exactly as Laravel does with Redis. There is no scaling advantage to the package — the underlying problem (atomic increment in a shared store) is identical, and Laravel's Redis-backed limiter is the better-supported implementation of it. PHP 8 compatibility has no bearing on this.
  • Design note for whichever path: rate limiting is per-key state, so correctness depends on a single logical store. Avoid per-node in-memory counters in any multi-instance deployment; enforce that in review.

Failure modes and mitigations.

  • Unvetted major upgrade (new with v4.0.0): undocumented breaking changes in a package with no user base to have stress-tested them. Mitigate by not adopting; if forced, pin exactly and read the diff.
  • Cache/Redis unavailable → limiter fails open (no throttling) or errors. Decide explicitly: fail-open for availability, fail-closed for abuse-critical endpoints. Native Laravel gives us this choice via exception handling; the package gives us a lightly maintained code path in that moment.
  • Over-aggressive limits → legitimate traffic 429s, customer-facing incident. Mitigate with staged rollout, metric-driven tuning, and distinct limiters per client class.
  • Key collision (NAT'd corporate IPs sharing a bucket) → under-serving real users. Mitigate by keying on authenticated identity where available and reserving IP keys for anonymous traffic.
  • Supply-chain exposure (package path): thinly maintained dependency in the request pipeline, no CVE monitoring, no path to a fix. This is the failure mode that should end the conversation, and v4.0.0 does not mitigate it.
  • Config drift — limits defined in two places. Mitigate by centralising all limiter definitions in one provider and covering them with tests.

Ramp-up.

  • Package: days to weeks of archaeology before the first safe change — now including "what changed in v4.0.0" — plus ongoing fork maintenance. No one on staff has exposure to it.
  • Native: hours. Any Laravel developer can define a limiter and wire middleware; the headers and 429 semantics are already standard. Documentation burden is a single internal page describing each endpoint's limit and rationale.

Recommendation. Reject fusonic/rate-limit-bundle at v4.0.0. The release clears the PHP-version constraint collision and nothing else; the decisive gates all still fail — stack fit (Symfony bundle in a Laravel estate), maintenance (single unspecific revival release, no stated support or security process), ecosystem (0 stars, 0 dependents, no support surface), and value (Laravel already provides a superior native equivalent). Adopt Illuminate\Cache\RateLimiter + throttle middleware, define limits per endpoint against a documented abuse/cost objective, back them with Redis, and instrument 429s. Revisit only if (a) a Symfony service enters the estate — and even then prefer symfony/rate-limiter — or (b) the package demonstrates a sustained release cadence, a published security policy, and non-zero adoption over at least two subsequent releases.

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.
abbasudo/artisan-route
mirvan/ippanel
ignibyte/aic-framework
glavweb/data-schema-bundle
glavweb/datagrid-bundle
tacticmedia/scim-server
uni-method/frame
neika-ai/sdk
adachsoft/php-code-style
pharaonic/laravel-notification-dependencies
beautinow/translug
dev-brainiac/bot-cloaked
octoberrain/html
octoberrain/extension
octoberrain/exception
octoberrain/contracts
adachsoft/api-version-bundle
cgv/localized-resource
noith/settings
kda/laravel-package