Symfony 4.3
New Mailer component
Symfony 5.0
New Notifier component as experimental
Notifier component announcement
Symfony 5.3
Notifier is not experimental anymore
Symfony 1.3
SwiftMailer as default
Sms
Chat
Push
Browser
🆕 Desktop 🆕
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
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
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
# 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
%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
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
Sms
Chat
Push
🆕 Desktop 🆕
Browser
Notifier
┣ 📁Bridge
┣ 📁Channel
┣ 📁DataCollector
┣ 📁Event
┣ 📁EventListener
┣ 📁Exception
┣ 📁FlashMessage
┣ 📁Message
┣ 📁Messenger
┣ 📁Notification
┣ 📁Recipient
┣ 📁Test
┣ 📁Tests
┣ 📁Transport
┣ Chatter
┣ ChatterInterface
┣ Notifier
┣ NotifierInterface
┣ Texter
┣ TexterInterface
┗ Transport
# config/packages/notifier.yaml
framework:
notifier:
channel_policy:
urgent: ['sms', 'chat/slack']
high: ['chat/slack']
medium: ['browser']
low: ['browser']