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

Fcm Bundle Laravel Package

redjanym/fcm-bundle

A Symfony bundle for Firebase Cloud Messaging (FCM) that provides simple services and configuration to send push notifications to Android and iOS devices through Google's FCM HTTP API.

View on GitHub
Deep Wiki
Context7

Technical Evaluation

Architecture fit

  • This remains a Symfony Bundle, not a Laravel package. Bundles rely on Symfony's kernel, Bundle class registration, DI extension config trees, and services.yaml conventions. Laravel has no equivalent loading mechanism, so the bundle cannot be installed and used as-is in a Laravel application. v2.1.1 does not change this — a PHP-version support statement modifies a composer constraint, not the loading model.
  • The reusable substance is narrower than the package name implies: an FCM HTTP v1 transport (OAuth2 service-account auth, token caching, message construction, endpoint calls) plus a thin configuration/DI wrapper. The wrapper is Symfony-only; the transport is where the value sits.
  • Assessment: the architecture does not fit our Laravel estate directly, but the underlying capability does. The correct framing for the decision is "adopt the transport client, discard the bundle," not "adopt this package."

Integration feasibility

  • Path A — adapter (recommended): depend on the underlying PHP FCM v1 client library that the bundle wraps, and expose it through a Laravel service provider, a NotificationChannel, and a queued job. This is a small, well-bounded piece of glue — roughly one to two developer-days plus test coverage.
  • Path B — sidecar: run a minimal Symfony service that owns the bundle and exposes an internal HTTP send endpoint. Only justified if another team already operates Symfony and wants to own push as a shared service. Adds a deployable, a network hop, and a second runtime to our platform surface.
  • Path C — build in-house: a direct Guzzle client against FCM v1 with google/auth for OAuth2. Viable, but re-implements token refresh, retry, and message-shape logic that this package already encodes.
  • v2.1.1 does not alter the effort estimate for any path; it only raises confidence that Path A will install on a modern PHP runtime.

Technical risk

  • Bus factor / ecosystem signal is the dominant risk. 43 stars and 0 dependents indicates essentially no production validation outside the author. This is a single-maintainer library with no commercial backing and no SLA. A patch release containing a single line of release notes reinforces — rather than mitigates — this concern.
  • Release hygiene / semver discipline (new). v2.1.1 ships a runtime support-matrix change as a patch release, with release notes consisting only of "PHP 8+ support." Widening or redefining the supported PHP range is a compatibility-signalling change and would normally warrant a minor bump plus a changelog entry enumerating what was tested. For us this means: (a) we cannot infer from the version number whether a given tag is safe to auto-bump, and (b) we must pin exact versions rather than caret ranges.
  • Under-specified compatibility claim (new). "PHP 8+" does not state whether 8.0/8.1 remain in the supported matrix (both are long past end-of-life), nor does it declare 8.2/8.3/8.4 explicitly. It says nothing about Symfony or Guzzle constraints, which are the versions that actually determine whether the transport installs alongside Laravel 10–12's dependency graph. Treat the claim as "PHP 8.0+ nominally allowed," not "modern PHP verified."
  • Metadata hygiene flag: the last-release date (2026-04-03) is future-dated relative to normal release cadence. Treat the release-frequency and maintenance signals from this dataset as unreliable and verify directly against Packagist/GitHub tags before committing. The v2.1.1 payload supplied here contains no date, diff, or CI status, so it does not resolve this flag.
  • Credential surface: FCM v1 mandates a Google service-account JSON and OAuth2 access tokens. That is a materially higher secret-management burden than the legacy server-key model, and it is the most likely source of production incidents.
  • Dependency coupling: transitive reliance on google/auth and Guzzle/PSR versions. Version pins may lag PHP minor releases. The v2.1.1 change may itself have loosened the PHP constraint — which cuts both ways: easier install, weaker guarantee that the maintainer has tested on our runtime.
  • Positive: MIT license removes legal friction; the FCM v1 API is a stable, Google-owned contract, so the API risk is low even if the wrapper is abandoned. v2.1.1 does confirm the package is not abandoned and that the maintainer is still touching compatibility metadata.

Key questions

  1. Which underlying client does the bundle delegate to, and is that library independently usable and maintained?
  2. Partly answered by v2.1.1: PHP 8+ is now claimed. Still open — which PHP 8 minors are actually tested in CI, does the change drop 8.0/8.1, and what are the Symfony and Guzzle constraint ranges? Check the composer.json diff between the previous tag and v2.1.1, not the release notes.
  3. Does it surface FCM's per-token error codes (e.g. UNREGISTERED, SENDER_ID_MISMATCH) in a way we can feed a token-pruning job?
  4. Does it support multicast/batch sends (up to 500 tokens per request), topics, and platform-specific overrides (APNs/Android config)?
  5. How are access tokens cached and refreshed — in-process, PSR-6 cache, or re-minted per call?
  6. Test coverage and CI status; is there a tagged, immutable release we can pin? Does any CI matrix exist that substantiates the new PHP 8+ claim?
  7. Is the maintainer responsive to issues, and would they accept a fork-and-adopt arrangement if needed?

Integration Approach

Stack fit

Concern Fit Note
Laravel service container Poor (as bundle) / Good (as library) Requires a hand-written service provider and config entry
Queue workers / Horizon Good Send belongs on a queue; retries map cleanly to job retries
Secret management Neutral Service-account JSON must live in our secrets store, not .env in plaintext
Observability Weak Expect to add our own logging/metrics around the client
PHP 8.2+ / Laravel 10–12 Likely good, now marginally better signalled v2.1.1 asserts PHP 8+; still verify the actual composer constraint diff and Laravel 12 dependency resolution

Migration path

  1. Baseline: inventory every place we send push today (legacy FCM server key, direct cURL, OneSignal, etc.). Legacy FCM server-key APIs are retired, so any remaining legacy call sites are already broken or deprecated — this is a correctness driver, not a nice-to-have.
  2. Credential provisioning: create a dedicated GCP project (or reuse), service account with Firebase Cloud Messaging API enabled, JSON key stored in the secrets manager, key-rotation runbook written.
  3. Adapter build: PushChannel interface with an FCM v1 implementation backed by the client library; device-token repository; invalid-token pruning consumer.
  4. Shadow mode: dual-send to a small internal cohort, compare delivery receipts and error distributions against the incumbent.
  5. Cutover by domain: migrate notification types one at a time (transactional → marketing), with a feature flag per type.
  6. Decommission: remove legacy credentials and code paths; revoke old server keys.

Compatibility

  • The v2.1.1 PHP 8+ statement removes the most basic blocker (a constraint that would have refused installation on our runtime) but does not validate the harder constraint — whether the bundle's Symfony components resolve cleanly against Laravel 10–12's symfony/* pins and Guzzle major. Run composer why-not / a throwaway composer require in a scratch Laravel skeleton before scheduling work.
  • Installing Symfony components into Laravel is supported but increases dependency-graph surface. Prefer the underlying library over the bundle precisely to avoid pulling the full bundle stack.
  • Pin exact versions. A patch release that changes the supported runtime range is exactly the scenario a caret range would silently absorb; and the low release cadence means a bad pin can strand us between tags.

Sequencing

  • Sprint 1: spike — send to a real device from a Laravel command; validate auth, payload shapes, error codes. Include a five-minute check of the v2.1.1 composer.json diff.
  • Sprint 2: adapter + tests + queue integration + observability.
  • Sprint 3: shadow traffic and cutover for the highest-volume notification type.
  • Sprint 4+: remaining types, legacy decommission, token-pruning automation.
  • No sequencing change is driven by v2.1.1; the release is not a gating item for any phase.

Operational Impact

Maintenance

  • Assume we own this. Budget roughly 0.1 FTE ongoing, concentrated in dependency bumps and Google API changes.
  • Decide up front between (a) pinning a tag and patching locally, or (b) maintaining a thin fork. Given 0 dependents, a fork is a realistic outcome and should be pre-approved rather than negotiated during an incident.
  • v2.1.1 strengthens the case for pinning plus a local patch branch. A single-line release note for a runtime-support change means we cannot rely on the changelog to tell us what moved. Require a composer.lock diff review for every upstream bump, however small the version number.
  • Watch upstream for breaking changes; the low star count means regressions may go unreported for weeks.

Support

  • No vendor, no SLA, no support contract. Escalation path terminates internally.
  • Documentation is README-scale, and v2.1.1 adds nothing to it — no upgrade notes, no compatibility matrix. Expect to write an internal runbook covering credential rotation, quota incidents, and token-pruning.

Scaling

  • Throughput is bounded by FCM project-level quotas, not by the library. Confirm current per-project limits with Google before capacity planning.
  • Use multicast batching (up to 500 tokens per request) for fan-out sends; per-token loops will not scale.
  • Reuse access tokens across requests and reuse HTTP connections (HTTP/2 multiplexing) — a naive client that mints a token and opens a connection per message will be the bottleneck before FCM is.
  • Scale via queue worker concurrency with a rate limiter, not by adding web-tier replicas.

Failure modes

Mode Symptom Mitigation
Invalid/expired device token UNREGISTERED / NOT_REGISTERED Consume error codes, prune tokens in a background job
Access-token expiry or clock skew 401 from FCM Refresh proactively; ensure NTP-synced hosts
Service-account key revoked/rotated Total send failure Rotation runbook, alerting on 401 rate, dual-key overlap window
Quota exhaustion / 429 Retry storm Exponential backoff with jitter; per-type rate limits
Oversized payload (>4 KB) 400 rejection Validate payload size at enqueue time
Data-only message not delivered Silent no-op in background Use notification + data for user-visible sends
APNs-specific rejection Android fine, iOS silent Per-platform config and separate error surfacing
Silent drop, no error Delivery rate quietly falls Track send-to-delivery ratio as a first-class metric
Untested PHP patch upgrade Fatal error at boot after a routine bump Pin exact versions; stage dependency bumps through CI, never auto-merge

Ramp-up

  • A mid-level PHP developer can be productive in two to three days; the FCM v1 protocol and error taxonomy are the learning curve, not the library.
  • Note for the team: "PHP 8+ support" in v2.1.1 is a claim, not a test report. Do not let it shorten the spike — the spike is where we confirm the claim on our actual runtime and Laravel version.
  • The real ramp-up cost is operational: teaching on-call to read FCM error codes, distinguish auth failures from token failures from quota failures, and know when to prune versus when to page.
  • Required onboarding artifacts: internal runbook, credential-rotation checklist, error-code cheat sheet, dashboard with send volume / error rate by code / invalid-token prune rate.

Recommendation Adopt the capability, not the package. Vendor the underlying FCM v1 client behind a Laravel-native adapter, pin aggressively, pre-approve a fork, and treat the bundle itself as reference implementation. v2.1.1 is a compatibility note, not a change in posture: it modestly improves the PHP-runtime story and confirms the maintainer is still active, but it arrives as a patch release with a one-line changelog that leaves Symfony/Guzzle constraints and tested PHP minors undeclared. The package still scores well against a generic quality model, but its ecosystem signal (43 stars, 0 dependents, single maintainer) means the score should not be read as production-readiness — the decision rests on Google's API stability, which is strong, and our willingness to own a small amount of glue, which is modest.

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.
skyraptor/chatter
edlugz/sasapay
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