symfony/notifier
Symfony Notifier sends notifications through multiple channels like email and SMS, with a flexible, extensible architecture for adding custom transports and integrations.
Architecture fit
NotifierInterface dispatches a Notification to channels (ChatChannel, SmsChannel, EmailChannel, BrowserChannel), each resolving a TransportInterface from a DSN string. Nothing in that path requires the Symfony framework — only symfony/contracts, symfony/options-resolver, symfony/http-client, and symfony/mailer where relevant — so it can sit inside a Laravel package without pulling the full container.symfony/*-notifier packages. For a TPM this is a 6–12 month build-vs-buy saving on provider integration and, more importantly, on provider API drift.Illuminate\Notifications already covers mail, database, broadcast, Vonage/Twilio SMS, and Slack. Adopting Notifier wholesale means two notification abstractions in one codebase. The viable architecture is to treat Notifier as a provider transport layer underneath Laravel's developer-facing notification API, not as a replacement for it.NotifierInterface is small and stable, which keeps the blast radius of a bad bet low: an adapter layer can be swapped without touching domain code.Integration feasibility
Notifier manually via a service provider, constructing channels and transports with Transport::fromDsn(); (b) full framework — not recommended, dragging symfony/framework-bundle into Laravel is a non-starter.'strategy' => 'failover') without leaking Symfony concepts to application developers.AsyncMessage behavior).Technical risk
symfony/symfony. The 802 stars and "0 dependents" are artifacts of that split, not a signal of adoption or abandonment. Issues and PRs are handled in the monorepo, so our contribution and triage path is upstream Symfony, not this repo. Any evaluator reading these numbers literally will misjudge the project.Notifiable trait integration, no Blade/markdown templating parity with Laravel mail. Those gaps are ours to fill.Key questions
Stack fit
acme/laravel-notifier) that (1) registers a service provider binding NotifierInterface, (2) exposes a publishable config file mapping Laravel-style config to DSNs per channel, and (3) ships an Illuminate\Notifications\Channel adapter so existing Notification classes can declare 'notifier' alongside 'mail' and 'database'.via(), toMail(), Notifiable) while gaining Notifier's transport coverage for the channels Laravel handles poorly or not at all — Telegram, Discord, Bluesky, Matrix, LINE, desktop.MailChannel on Laravel Mail. Symfony's EmailChannel adds nothing here and duplicates configuration.Migration path
Illuminate\Notifications (no first-party Telegram/Discord/Bluesky channel exists in Laravel).Compatibility
composer.json constraint of ^7.4 across symfony/notifier and every symfony/*-notifier bridge prevents skew, which is a documented source of past bugs (e.g., the Novu bridge needing a widened constraint for 7.x).Sequencing
Maintenance
Support
TransportExceptionInterface, which is well-defined but generic. Support engineers will need runbooks per provider, since "Slack rejected the payload" and "Twilio rate-limited us" produce different diagnostics.MessageEvent, FailedMessageEvent) map cleanly onto Laravel's event system — wire them to logging and an alerting channel on day one, before the first production send.Scaling
Failure modes
Ramp-up
via() array.How can I help you explore Laravel packages today?