reliefapps/notification-bundle
Symfony bundle that adds a flexible notification system to your app: create, persist, and deliver notifications to users through configurable channels. Includes Doctrine integration, Twig templates, and simple setup so you can wire notifications into existing projects quickly.
Architecture fit. The package is a Symfony 3 bundle, not a Laravel package. Its integration surface is idiomatic Symfony: a Bundle subclass, a DependencyInjection/Extension for the config tree, YAML/XML service definitions, tagged services, and container compilation passes. None of that maps onto Laravel's service provider / facade / config-repository model. There is no laravel-compatible autodiscovery, no PackageManifest entry, no Illuminate\Support\ServiceProvider. A Laravel team cannot composer require this and get working push notifications; at best they can instantiate the underlying transport classes manually and wire them in a service provider, which means owning the glue layer from day one.
Integration feasibility. Low as a dependency, moderate as a reference implementation. The package is small (a notification bundle typically spans a handful of transports plus a dispatcher), so the extraction cost is bounded. The realistic path is to read it, port the APNs/FCM adapters behind a Laravel-native contract, and discard the bundle scaffolding.
Technical risk. High, and concentrated in three places:
readonly, and return-type incompatibilities on a straight port..p8 keys, service account JSON), which raises the cost of an unpatched dependency well above the "we'll get to it" tier.The aggregate score of 0.0225 is the honest signal here; the 0.94 opportunity sub-score is not a reason to adopt.
Key questions for engineering (time-box these into the spike):
.p8) auth, or only certificate auth?composer.json, and how many classes fail to parse under PHP 8.2?410 Unregistered? Silent failure is the most expensive outcome to discover in production.Stack fit: do not adopt as a dependency. Recommendation to the steering group is to treat reliefapps/notification-bundle as a design reference, not a vendor package. The Laravel ecosystem has maintained alternatives for every capability this bundle offers — kreait/firebase-php for FCM v1, edamov/pushok or paragraph1/php-apns for APNs HTTP/2, laravel-notification-channels/* for channel wiring, or managed providers (SNS, OneSignal, Pinpoint) if we want to avoid owning transport code at all. Any of these is a lower total-cost-of-ownership bet than resurrecting an archived Symfony 3 bundle.
Migration path (if the team still wants to mine it):
composer install against a PHP 7.4 container, static-analyze, and determine whether the provider calls are live or dead. Document the transport class list.PushChannel interface in our own namespace with send(DeviceToken $token, Notification $payload): DeliveryResult and an explicit DeliveryResult enum covering success, invalid token, throttle, and transient failure. This is the artifact we actually keep.UNREGISTERED), per-provider rate limiting, retry with jitter on 429/5xx, and structured delivery logging.Compatibility. Assume nothing passes composer validate or static analysis against PHP 8.2. Plan for the port to be a rewrite of the transport layer with the bundle as a spec, not a cherry-pick. Also check the license header on each file you lift — MIT is permissive, but keep the attribution file.
Sequencing. Do not put this on the critical path of a feature release. Sequence it as: provider-API investigation → interface definition → parallel build of APNs and FCM adapters → token-lifecycle work → load test. If the product deadline is tight, buy a managed push provider and move on; the bundle is not a schedule-saver.
Maintenance. Zero upstream. The moment it enters the codebase, it is a fork with no remotes. Assign a named owner. Budget roughly 10–15% of one engineer per quarter for dependency patching and provider-API drift — Google and Apple do change auth and payload schemas, and APNs certificate rotation is an annual at-minimum operational task.
Support. No maintainer, no issue triage, no Slack, no security contact. Incident response for a broken push pipeline is entirely internal. Escalation paths end at the provider's status page.
Scaling. Provider-side limits dominate: FCM v1 rate-limits per project, APNs enforces per-connection HTTP/2 stream limits. The bundle-era code predates connection reuse and batching patterns, so plan to run sends through Laravel queues with per-provider worker pools, bounded concurrency, and exponential backoff. Fan-out cost is linear in device count — model it before a marketing blast, not during one.
Failure modes to instrument explicitly:
.p8 key → total iOS outage, often silent from the app's perspective.UNREGISTERED because the endpoint is the retired GCM host → 100% Android failure that looks like a transport bug, not a config bug.Emit a delivery metric per channel per attempt with a result code, and alert on error-rate and on zero-traffic (a dead channel is more dangerous than a failing one).
Ramp-up. Reading and understanding the bundle is cheap — one to two days for a mid-level PHP developer, given the small codebase. The expensive ramp is provider knowledge: HTTP/2 APNs semantics, FCM v1 OAuth scopes, and token lifecycle. That knowledge is not in this repository, so staff or train for it separately and do not assume the package's presence shortens the learning curve.
How can I help you explore Laravel packages today?