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

Email

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 

Email

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

Email

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

Made with Slides.com