proklung / bitrix.notifier.module
将 Symfony Notifier 组件集成到 Bitrix
Requires
- php: >=7.1 || ^8.0
- ext-json: *
- composer/installers: ~1
- league/html-to-markdown: ^5.0
- proklung/bitrix-containerable-boilerplate: ^1.1
- proklung/bitrix.module.boilerplate: ^1.0
- symfony/event-dispatcher: ^4.4 || ^5
- symfony/google-mailer: ^4.4 || ^5.0
- symfony/http-foundation: ^4.4 || ^5
- symfony/mailer: ^4.4 || ^5.0
- symfony/messenger: ^4.4 || ^5.0
- symfony/mime: ^4.4 || ^5.0
- symfony/monolog-bridge: ^5
- symfony/notifier: ^5
- symfony/twig-bridge: ^4.4 || ^5
- twig/twig: ~1 || ~2 || ~3
Requires (Dev)
- icanhazstring/composer-unused: ^0.7.5
README
原始组件的文档。总体上,模块遵循原始组件的布局。主要区别在于服务的配置方式(不是 Yaml,而是 Bitrix 的数组配置)。
安装
主要项目的 composer.json
"extra": { "installer-paths": { "./bitrix/modules/{$name}/": ["type:bitrix-d7-module", "type:bitrix-module"], "./bitrix/components/{$name}/": ["type:bitrix-d7-component", "type:bitrix-component"], "./bitrix/templates/{$name}/": ["type:bitrix-d7-template", "type:bitrix-theme"] } }
和
"repositories": [ { "type": "git", "url": "https://github.com/proklung/bitrix.notifier.module" }, { "type": "git", "url": "https://github.com/proklung/bitrix.containerable.boilerplate" } ]
$ composer require proklung/bitrix-notifier-module
在网站的行政界面中安装模块 proklung.notifier
,在 bitrix/admin/partner_modules.php
将以下代码添加到您的 init.php
use Bitrix\Main\Loader; Loader::includeModule('proklung.notifier');
使用(简单示例)
向 Telegram 聊天发送消息
use Symfony\Component\Notifier\Message\ChatMessage; $container = \Proklung\Notifier\DI\Services::boot(); $chatter = $container->get('chatter'); $notification = (new ChatMessage('Hi from module')); $chatter->send($notification);
发送 SMS(假设已配置相应传输)
use Symfony\Component\Notifier\Message\SmsMessage; $container = \Proklung\Notifier\DI\Services::boot(); $texter = $container->get('texter'); $sms = new SmsMessage( '+79263622508', 'Тестирование!' ); $sentMessage = $texter->send($sms);
发送电子邮件(注意:现在所有设置均针对通过 Gmail 发送;未测试 SMTP)
use Symfony\Component\Notifier\Notification\Notification; use Symfony\Component\Notifier\Recipient\Recipient; $notifier = \Proklung\Notifier\DI\Services::getInstance()->get('notifier'); $notification = (new Notification('New Invoice', ['email'])) ->content('You got a new invoice for 15 EUR.'); $recipient = new Recipient( 'email_customer@gmail.com', '+71111111' ); $notifier->send($notification, $recipient);
依赖关系
模块没有多余的依赖。仅包含 Symfony Mailer
。需要的传输可以单独获取。
例如,如果需要发送 Telegram 消息,则需要安装包 symfony/telegram-notifier
。因为它“标准”,所以会自动获取。
如果需要连接自定义传输,则通过 /bitrix/.settings.php
进行操作(见下文)。
配置文件
配置与父包相同。通过编辑文件 bitrix/.settings.php
进行设置。
proklung.notifier
部分
return [ // .... 'proklung.notifier' => [ 'value' => [ 'notifier' => [ // https://symfony.com.cn/doc/current/notifier.html#configuring-channel-policies 'channel_policy' => [ 'high' => ['chat'], 'medium' => ['email'] ], 'chatter_transports' => [ 'telegram' => 'telegram://315114113:AAFjvQlEiaWisZsav_YQfwmhEIIP9PFw3Ss@default?channel=-1001595706876', ], 'texter_transports' => [ 'smstraffic' => 'smstraffic://mosfond1:pnLag4yN@default?from=MFC', ], ], 'parameters' => [ 'cache_path' => '/bitrix/cache/s1/proklung.notifier', // Путь к закешированному контейнеру 'container.dumper.inline_factories' => false, // Дампить контейнер как одиночные файлы 'compile_container_envs' => ['prod'], // Окружения при которых компилировать контейнер ], 'services' => [ // Дополнительный кастомный транспорт. // Сервисы инстанцируются без auto-wiring 'smstraffic.factory' => [ 'class' => 'Prokl\Component\Notifier\Bridge\SmsTraffic\SmsTrafficTransportFactory', 'tags' => ['name' => 'texter.transport_factory'], ], ], 'mailer' => [ 'enabled' => true, 'dsn' => 'gmail+smtp://robotivanov2020:izjqfjyegwmznrtb@default', 'envelope' => [ // Получатель писем 'recipients' => ['testing@mail.ru'], // Поле from отправляемого письма 'sender' => 'sender@gmail.com', // Важный параметр, если иметь дело с почтой. ], ], // Конфигурация Твига (для генерации писем) 'twig' => [ 'cache_dir' => $_SERVER['DOCUMENT_ROOT'] . '/bitrix/cache/twig', 'config' => [], 'paths' => [$_SERVER['DOCUMENT_ROOT'] . '/'], ], ], ] ];
参数支持诸如 '%env(TELEGRAM_DSN)%'
(对 TELEGRAM_DSN
环境变量的引用)之类的功能。
容器缓存
cache_path
参数 - 指向编译后的容器存放的路径。如果未设置,则默认为 /bitrix/cache/s1/proklung.redis
。
假设系统中已安装环境变量 DEBUG
到 $_ENV
数组中。如果没有,则默认假定环境为“调试”。
compile_container_envs
参数(数组)指示需要缓存容器的环境。
目前的简单逻辑:如果 $_ENV["DEBUG"] === true
,则环境为 dev
,否则为 prod
。
其他
FlashBag
用于处理发送到 browser
通道。两种选择
- 公共服务
session_instance
将返回会话实例,其中包含getFlashBag
方法。 - 助手
\Proklung\Notifier\DI\Services::getFlashBag()
做同样的事情。
使用 Bitrix 邮件事件及其模板
use Proklung\Notifier\Bitrix\Sender\BitrixMailEventSender; $bitrixEventHandler = BitrixMailEventSender::getInstance( \Proklung\Notifier\DI\Services::getInstance()->get('notifier') ); // Или так: $bitrixEventHandler = \Proklung\Notifier\DI\Services::get('bitrix.notifier.mail'); // Массив, идентичный с параметром fields при отправке Битриксом сообщений // См. https://dev.1c-bitrix.ru/api_help/main/reference/cevent/send.php $arFields = ['NAME' => 'testing email', 'EMAIL' => 'recipitient@gmail.com']; // Будет оправлено сообщение в канал email и сделана запись в таблице b_event. $bitrixEventHandler->send('CODE_MAIL_EVENT', $arFields);
发送失败不会静默处理。如果出现问题,则会抛出异常。
根据 channel_policy 发送 Bitrix 事件
条件 channel_policy
在 /bitrix/,settings.php
'channel_policy' => [ //... 'medium' => ['email', 'chat/telegram'], //... ],
use Proklung\Notifier\Bitrix\Sender\BitrixPolicySender; use Symfony\Component\Notifier\Notification\Notification;; /** @var BitrixPolicySender $bitrixEventHandler */ $bitrixEventHandler = BitrixPolicySender::getInstance( \Proklung\Notifier\DI\Services::getInstance()->get('notifier') ); // Или так: $bitrixEventHandler = \Proklung\Notifier\DI\Services::get('bitrix.notifier.policy'); // Массив, идентичный с параметром fields при отправке Битриксом сообщений // См. https://dev.1c-bitrix.ru/api_help/main/reference/cevent/send.php $arFields = ['NAME' => 'testing email', 'EMAIL' => 'recipitient@gmail.com']; // Будет оправлено сообщение в канал email и telegram, а также сделана запись в таблице b_event. $bitrixEventHandler->send('CODE_MAIL_EVENT', $arFields, Notification::IMPORTANCE_MEDIUM);
使用 Bitrix SMS 事件及其模板
use Proklung\Notifier\Bitrix\Sender\BitrixSmsSender; $bitrixEventHandler = BitrixSmsSender::getInstance( \Proklung\Notifier\DI\Services::getInstance()->get('texter') ); // Или так: $bitrixEventHandler = \Proklung\Notifier\DI\Services::get('bitrix.notifier.sms'); // Массив, идентичный с параметром fields при отправке Битриксом сообщений $arFields = [ 'SENDER' => 'test', 'RECEIVER' => '+7926111111', 'USER_PHONE' => '+7926111111', 'CODE' => '123' ]; // Будет оправлено SMS и сделана запись в таблице b_event. $bitrixEventHandler->send('SMS_USER_RESTORE_PASSWORD', $arFields);
发送失败会被静默处理。如果发送 SMS 时出现问题,则不会有任何提示,但会在 b_event
表中生成一个带有失败标志和错误文本的记录。
将 Bitrix 邮件模板发送到 Telegram
use Proklung\Notifier\Bitrix\Sender\BitrixTelegramEventSender; $bitrixEventHandler = BitrixTelegramEventSender::getInstance( \Proklung\Notifier\DI\Services::getInstance()->get('chatter') ); // Или так: $bitrixEventHandler = \Proklung\Notifier\DI\Services::get('bitrix.notifier.telegram'); $arFields = ['CODE' => '2222', 'LINK' => 'http://site.loc/']; $bitrixEventHandler->send('TEST_EVENT', $arFields);
必须安装 symfony/telegram-notifier
并在 /bitrix/.settings.php
文件的 chatter_transports
部分注册传输 telegram
。
注意事项
- Telegram 很难处理 html(即使在
parse_mode = html
模式下)。因此,在底层,html 模板将转换为 markdown 格式。