1
0

More than 1 year has passed since last update.

いろいろなサービスで通知する、"Notifier"

Last updated at Posted at 2022-12-11

Symfony Component Advent Calendar 2022の12日目の記事です。

最初に

SymfonyはPHPのフレームワークのひとつです。しかし、公式サイトの説明文には

Symfony is a set of PHP Components, a Web Application framework, a Philosophy, and a Community — all working together in harmony.
(SymfonyはPHPコンポーネントのセットで、Webアプリケーションフレームワークで、哲学、そしてコミュニティです。それらがハーモニーを奏でながら動作しています。)

と書かれている通り、PHPコンポーネントのセットで、たくさんのコンポーネントを提供しており、それらを組み合わせてひとつのフレームワークとして動作しています。Symfonyのコンポーネントは、Symfony上だけで動作するのではなく、他のPHPフレームワークやアプリケーションでも動作している強力なものが揃っています。

今回はそれらの中から、役立ちそうなもの・お薦めしたいものを紹介していきたいと思います。

※記事内ではautoloadのインポートは省略します。

いろいろなサービスで通知する、"Notifier"

Notifierは、メールも含めていろいろなサービスを使って通知を行うコンポーネントです。前述のとおりメールも対象なのでMailerに依存しています。

インストール

composer require symfony/notifier

通知は5種類

通知は大まかに分けて5種類の通知を用意してあり、各種さまざまなプロバイダをサポートしています。

種類 概要
SMS SMSメッセージで通知
Chat テキストチャットサービスで通知
Email メールで通知
ブラウザ 画面上にフラッシュメッセージで通知
Push Push通知

Mailerと同じく、それぞれの種類ごとに複数のプロバイダをサポートしていて、利用するためにはコンポーネントを追加でインストールします。また、DSNの設定も同じく.envに設定します。

.env
CHATWORK_DSN=chatwork://{APIトークン}@default?room_id={ルームID}
config/packages/notifier.yaml
framework:
    notifier:
        chatter_transports:
            slack: '%env(CHATWORK_DSN)%'

通知を送る

通知を送る場合、Notificationオブジェクトを作成し、NotifierInterfaceを使って通知を送信します。

ItemController.php

use Symfony\Component\Notifier\Notification\Notification;
use Symfony\Component\Notifier\NotifierInterface;
use Symfony\Component\Notifier\Recipient\Recipient;

class ItemController extends AbstractController
{
    public function publish(NotifierInterface $notifier): Response
    {
        $notification = new Notification('メッセージ', ['email', 'sms']);
        $recipient = new Recipient('{メールアドレス}', '{電話番号}'); // どちらかが必要

        $notifier->send($notification, $recipient);
    }
}

Chatサービスなどの通知先を指定する必要がなかったりメールアドレス・電話番号ではない場合は、ChatterInterface, TexerInterfaceなどのクラスを使い、送信処理を行います。
利用する場合は、それぞれ専用の通知クラスを使います。


public function publish(ChatterInterface $chatter, TexterInterface $texer): Response
{
    $chatMessage = new ChatMessage('メッセージ'); // Chatの場合
    $chatter->send($chatMessage);

    $pushMessage = new PushMessage('メッセージ'); // Push通知の場合
    $texter->send($pushMessage);
}

通知を設定する

通知によって、送り先を変えたり設定を変更したい場合もあります。そのような場合は、それぞれのプロバイダで専用の設定クラスが用意されています。例えばChatworkの場合、

ItemController.php
class ItemController extends AbstractController
{
    public function publish(ChatterInterface $chatter): Response
    {
        // メッセージ
        $chatMessage = new ChatMessage('メッセージ');

        // オプション設定
        $chatworkOptions = new ChatworkOptions([]);
        $chatworkOptions
            ->to(['{ルームID}']) // ルームIDの指定
            ->selfUnread(false)
        ;
        $chatMessage->options($chatworkOption);
        
        $chatter->send($chatMessage); // 送信
    }
}

ChatworkOptionsオブジェクトを作成し、そこに設定を行います。そのオブジェクトをChatMessageオブジェクトに渡すことで、指定のルームにメッセージを送ることができます。

フェイルオーバー、ラウンドロビン

コンポーネントの設定により、フェイルオーバー、ラウンドロビンに対応できます。

config/packages/notifier.yaml
framework:
    notifier:
        chatter_transports:
            # Slackで送信エラーの場合はChatworkで送る
            main: '%env(SLACK_DSN)% || %env(CHATWORK_DSN)%'

            # Slackで送った後の次の通知はChatworkで送る
            roundrobin: '%env(SLACK_DSN)% && %env(CHATWORK_DSN)%'

まとめ

今回はNotifierを紹介しました。Mailerと似たようなコンポーネントですが、システム管理者に対しての通知だったり、SMS, チャットサービスを利用した通知だったりを行うことができ、とても便利なコンポーネントです。

補足

Symfony 6.2からChatworkが利用できるようになりました
私が作成しました。ぜひご活用ください。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0