Symfony Notifier
Return of the mailman

History
05-2019
Symfony 4.3
New Mailer component
11-2019
Symfony 5.0
New Notifier component as experimental
09-2019
Notifier component announcement
05-2021
Symfony 5.3
Notifier is not experimental anymore
11-2009
Symfony 1.3
SwiftMailer as default

What is it ?

What is it ?

Channels
Sms
Chat
Push
Browser
🆕 Desktop 🆕
How does it work ?
Notifier
EmailChannel
SmsChannel
✉️
✉️
🔔
🔔
Texter & Chatter
✉️
Transports
Notifier
┣ 📁Bridge
┣ 📁Channel
┣ 📁DataCollector
┣ 📁Event
┣ 📁EventListener
┣ 📁Exception
┣ 📁FlashMessage
┣ 📁Message
┃ ┣ ChatMessage
┃ ┣ DesktopMessage
┃ ┣ EmailMessage
┃ ┣ FromNotification..
┃ ┣ MessageInterface
┃ ┣ MessageOptionsIn..
┃ ┣ NullMessage
┃ ┣ PushMessage
┃ ┣ SentMessage
┃ ┗ SmsMessage
┣ 📁Messenger
┣ 📁Notification
┣ 📁Recipient
┣ 📁Test
┣ 📁Tests
┗ 📁Transport
Messages
SmsMessage
ChatMessage
PushMessage
DesktopMessage
EmailMessage
interface MessageInterface
{
public function getRecipientId(): ?string;
public function getSubject(): string;
public function getOptions(): ?MessageOptionsInterface;
public function getTransport(): ?string;
}Notifier
┣ 📁Bridge
┃ ┣ 📁Brevo
┃ ┃ ┣ BrevoTransport
┃ ┃ ┗ BrevoTr..Factory
┣ 📁Channel
┣ 📁DataCollector
┣ 📁Event
┣ 📁EventListener
┣ 📁Exception
┣ 📁FlashMessage
┣ 📁Message
┣ 📁Messenger
┣ 📁Notification
┣ 📁Recipient
┣ 📁Test
┣ 📁Tests
┣ 📁Transport
┃ ┣ AbstractTransport
┃ ┣ AbstractT..Factory
┃ ┣ Dsn
┃ ┣ FailoverTransport
┃ ┣ NullTransport
┃ ┣ NullTrans..Factory
┃ ┣ RoundRobinTransp..
┃ ┣ TransportFact..I..
┃ ┣ TransportInterfa..
┃ ┗ Transports
┗ Transport
Transports
interface TransportInterface extends \Stringable
{
/**
* @throws TransportExceptionInterface
*/
public function send(MessageInterface $message): ?SentMessage;
public function supports(MessageInterface $message): bool;
}🚢
🚲
🚊
🚁
🚌
Notifier
┣ 📁Bridge
┣ 📁Channel
┣ 📁DataCollector
┣ 📁Event
┣ 📁EventListener
┣ 📁Exception
┣ 📁FlashMessage
┣ 📁Message
┣ 📁Messenger
┣ 📁Notification
┣ 📁Recipient
┣ 📁Test
┣ 📁Tests
┣ 📁Transport
┣ Chatter
┣ ChatterInterface
┣ Notifier
┣ NotifierInterface
┣ Texter
┣ TexterInterface
┗ Transport
Chatter, Texter (& Mailer)
# config/packages/notifier.yaml
framework:
notifier:
texter_transports:
twilio: twilio://SID:TOKEN@default?from=FROM
brevo: brevo://API_KEY@default?sender=SENDER
chatter_transports:
slack: slack://TOKEN@default?channel=CHANNEL
bluesky: bluesky://user:p4ssw0rd@bsky.social
Sms
Desktop
Chat
Push
MAILER
CHATTER
TEXTER
Notifier
┣ 📁Bridge
┣ 📁Channel
┣ 📁DataCollector
┣ 📁Event
┣ 📁EventListener
┣ 📁Exception
┣ 📁FlashMessage
┣ 📁Message
┣ 📁Messenger
┣ 📁Notification
┣ 📁Recipient
┣ 📁Test
┣ 📁Tests
┗ 📁Transport
┣ AbstractTransport
┣ AbstractT.Factory
┣ Dsn
┣ FailoverTransport
┣ NullTransport
┣ NullTrans..Factory
┣ RoundRobinTransp..
┣ TransportFact..I..
┣ TransportInterfa..
┗ Transports
Transport aggregates
Transports
FailoverTransport
RoundRobinTransport
%FIST_DSN% && %SECOND_DSN%%FIST_DSN% || %SECOND_DSN%Notifier
┣ 📁Bridge
┣ 📁Channel
┣ 📁DataCollector
┣ 📁Event
┣ 📁EventListener
┣ 📁Exception
┣ 📁FlashMessage
┣ 📁Message
┣ 📁Messenger
┣ 📁Notification
┃ ┣ ChatNotificat..I..
┃ ┣ DesktopNotifi..I..
┃ ┣ EmailNotifica..I..
┃ ┣ Notification
┃ ┣ PushNotificat..I..
┃ ┗ SmsNotificationI..
┣ 📁Recipient
┣ 📁Test
┣ 📁Tests
┗ 📁Transport
Notification & contracts
class Notification
{
private array $channels = [];
private string $subject = '';
private string $content = '';
private string $emoji = '';
private ?FlattenException $exception = null;
private string $exceptionAsString = '';
private string $importance = self::IMPORTANCE_HIGH;
...
}interface SmsNotificationInterface
{
public function asSmsMessage(
SmsRecipientInterface $recipient,
?string $transport = null
): ?SmsMessage;
}Notifier
┣ 📁Bridge
┣ 📁Channel
┃ ┣ AbstractChannel
┃ ┣ BrowserChannel
┃ ┣ ChannelInterface
┃ ┣ ChannelPolicy
┃ ┣ ChannelPolicyInt..
┃ ┣ ChatChannel
┃ ┣ DesktopChannel
┃ ┣ EmailChannel
┃ ┣ PushChannel
┃ ┗ SmsChannel
┣ 📁DataCollector
┣ 📁Event
┣ 📁EventListener
┣ 📁Exception
┣ 📁FlashMessage
┣ 📁Message
┣ 📁Messenger
┣ 📁Notification
┣ 📁Recipient
┣ 📁Test
┣ 📁Tests
┗ 📁Transport
Channels
Sms
Chat
Push
🆕 Desktop 🆕
Browser
- Convert Notification -> Message
- Dispatches to bus || Send to transport
Notifier
┣ 📁Bridge
┣ 📁Channel
┣ 📁DataCollector
┣ 📁Event
┣ 📁EventListener
┣ 📁Exception
┣ 📁FlashMessage
┣ 📁Message
┣ 📁Messenger
┣ 📁Notification
┣ 📁Recipient
┣ 📁Test
┣ 📁Tests
┣ 📁Transport
┣ Chatter
┣ ChatterInterface
┣ Notifier
┣ NotifierInterface
┣ Texter
┣ TexterInterface
┗ Transport
Notifier
- Resolves channels and transportNames for a notification
# config/packages/notifier.yaml
framework:
notifier:
channel_policy:
urgent: ['sms', 'chat/slack']
high: ['chat/slack']
medium: ['browser']
low: ['browser']- Send that notification to all recipients through each selected channels
Let's code
Symfony Notifier: Return of the mailman
By Raphaël Geffroy
Symfony Notifier: Return of the mailman
- 118