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

Bouncer Bundle Laravel Package

neogen/bouncer-bundle

Neogen Bouncer Bundle wraps Bouncer's role and permission system for Laravel into a ready-to-use package, so you can define roles, assign abilities, and gate access with concise authorization checks and minimal configuration, keeping user permissions readable and easy to audit.

View on GitHub
Deep Wiki
Context7

Technical Evaluation

Framing correction: despite the "Laravel/PHP package" label, neogen/bouncer-bundle is a Symfony bundle, not a Laravel package. That distinction drives most of the assessment below.

Architecture fit — poor. The package is built around two things that no longer exist in a modern stack:

  • Symfony bundle conventions (DI extension, compiler passes, bundle registration in AppKernel/bundles.php, config tree under a bundle alias). Laravel has no equivalent registration mechanism; a bundle cannot be installed into a Laravel app and "just work" without a custom service provider wrapper that reimplements the container wiring.
  • SwiftMailer filters. SwiftMailer was deprecated in favour of Symfony Mailer and removed in Symfony 6. Laravel moved off SwiftMailer at Laravel 9. Any project on a supported framework version (Laravel 9+, Symfony 5.4+) cannot use the filter integration at all.

Integration feasibility — low as a dependency, moderate as a reference. The genuinely reusable surface is small: SNS/SES notification parsing (bounce, complaint, delivery types), suppression-list state, and the send-time gate. That is plausibly a few hundred lines of plain PHP that would need to be extracted and rewired regardless of framework. Composer constraints from a 2017 release will almost certainly pin symfony/symfony 2.x/3.x and PHP 5.5–7.x, so composer require will fail on conflict before you even reach runtime.

Technical risk — high, concentrated in three areas:

  1. Abandonment. Last release 2017-12-29, zero stars, zero dependents. No security disclosure path, no PHP 8 compatibility, no maintenance.
  2. Blast radius. This code sits in the mail-sending path. A defect doesn't degrade a feature; it either blocks legitimate mail or silently permits mail to known-bad addresses, which is exactly the failure mode that gets SES accounts placed under sending review.
  3. Provider drift. SES has shipped native account-level suppression lists and configuration-set event destinations since this package was written. Much of the original value proposition is now a console toggle.

Key questions to resolve before any decision:

  • Does it expose an SNS webhook, or does it poll? (Webhook + signature verification is the only defensible modern design.)
  • Does it validate the SNS message signature and topic ARN, or trust the payload?
  • Where does suppression state live — DB, Redis, or in-memory? Is the send-path lookup cached?
  • Is the SwiftMailer filter a hard dependency, or is core bounce handling framework-agnostic?
  • What licence, and is the code small enough to audit end-to-end in an afternoon?
  • What is the actual requirement — compliance evidence, reputation protection, or app-side suppression sync? SES native suppression may already satisfy two of the three.

Integration Approach

Stack fit: effectively zero for both Laravel and modern Symfony. Treat this repository as a design reference, not a dependency. Do not add it to composer.json.

Migration path (recommended):

  1. Provider-first, code-second. Enable the SES account-level suppression list and attach a configuration set with an event destination (SNS or EventBridge) to your sending identity. This delivers bounce/complaint suppression with no application code and no maintenance burden. Do this before evaluating any package.
  2. Only then decide what remains. Typical residual need: application-side visibility (flag the user record, stop in-app notifications to a hard-bounced address), audit trail, or syncing suppression into a CRM.
  3. Port the concept, not the code. Read the repo for the SES notification schema handling, then implement:
    • an SNS subscription endpoint with signature and topic-ARN validation,
    • idempotent handling keyed on mail.messageId,
    • a suppression table with email, reason, timestamp, source,
    • a cached lookup (Redis or a warm in-process map) consulted before send,
    • a dead-letter queue for unparseable notifications.
  4. Delete the SwiftMailer filter idea entirely. Use a Symfony Mailer event listener or a Laravel mailable middleware/MessageSending event instead.

Compatibility: source will require PHP 8 fixes, symfony/* 6/7 or Laravel 10/11/12 rewiring, and replacement of every SwiftMailer import. At that point you have rewritten it.

Sequencing: (1) confirm the requirement and whether SES native suppression covers it; (2) if not, budget ~1–2 engineer-days for a from-scratch webhook + suppression table; (3) ship suppression enforcement in shadow mode (log-only) for a week to validate parsing against real traffic; (4) enforce. Never run enforce-mode on day one.

Operational Impact

Maintenance: you inherit full ownership. Since the package is unmaintained and framework-incompatible, "maintenance" means maintaining a fork you wrote — the cost curve is identical to owning first-party code, but with the added burden of an unfamiliar abandoned codebase and no upstream to rebase against. Abandoned status also blocks clean dependency auditing; security scanners will flag it indefinitely.

Support: no maintainer, no community, no issue history of value. Escalation path is the source code. Zero dependents means no field-tested edge cases — the SES notification variants (transient vs. permanent bounce, complaint feedback types, ComplaintFeedbackType) will be encountered by your team first.

Scaling: two pressure points. First, the send-path lookup: a per-message suppression check against an uncached database table will add latency and load linearly with mail volume; cache aggressively and make it fail-open with alerting rather than fail-closed on cache miss, or a Redis blip halts all outbound mail. Second, the ingestion path: SES delivers notifications in bursts and SNS retries aggressively, so the endpoint must be queue-backed, idempotent, and horizontally scalable — a synchronous parse-and-write handler will buckle under a large bounce event.

Failure modes to design against:

  • Silent suppression failure — notifications arrive but aren't parsed (schema drift, unhandled notificationType), so bad addresses keep receiving mail. Reputation damage compounds invisibly. Mitigate with a parser-error metric and a daily reconciliation count against SES's own bounce metrics.
  • Unverified SNS payloads — an unauthenticated endpoint lets anyone suppress arbitrary addresses (denial of service against your own user base). Signature validation is mandatory, not optional.
  • Replay/duplication — non-idempotent writes inflate suppression counts and corrupt audit reporting.
  • Fail-closed cache miss — mail outage mistaken for a suppression event.
  • Compliance exposure — unhandled complaints are a legal concern under CAN-SPAM and similar regimes; the notification must reach a durable store, not just a log line.

Ramp-up: low. The domain (SES notification schema, SNS verification, suppression semantics) is learnable in a day or two by a mid-level engineer, and the code volume being replaced is small. The real ramp-up cost is organisational: someone must own the decision to build versus buy, and someone must own the on-call runbook for "mail stopped" versus "mail should have stopped."

Bottom line for the roadmap: deprioritise as a dependency; schedule a half-day spike to confirm SES native suppression covers the requirement, and reserve a 1–2 day build slot for a first-party suppression listener if it doesn't. The package is useful only as a reading list.

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.
elmogy/larafast
xeviant/laravel-paystack
gorilladash/laravel-website-sdk
martialbe/flysystem-oss
chondal/3312client
jeroen-g/flickr
opscale-co/nova-genbi
itsjustvita/laravel-retention
tequilarapido/trackit
gregsphotography/site-builder-filament
cabaoctavio/laravel-query-log
gregsphotography/site-builder-components
io-digital/clickatell
snowsoft/laravel-admin
oxygen/auth
relicsoftware/barakah-payment-gateway
tobya/work-with-composer
equipc/laravel-email-validator
equipc/laravel-email-database-log
adedsec/nova-translated-labels