Skip to content

Commit f8224eb

Browse files
committed
BitrixPolicySender & абстракция
1 parent e48a1ca commit f8224eb

File tree

6 files changed

+144
-49
lines changed

6 files changed

+144
-49
lines changed
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
<?php
2+
3+
namespace Proklung\Notifier\Bitrix\Contract;
4+
5+
use Bitrix\Main\ArgumentException;
6+
use Bitrix\Main\ObjectPropertyException;
7+
use Bitrix\Main\SystemException;
8+
9+
/**
10+
* Interface BitrixNotifierSenderInterface
11+
* @package Proklung\Notifier\Bitrix\Contract
12+
*
13+
* @since 29.07.2021
14+
*/
15+
interface BitrixNotifierSenderInterface
16+
{
17+
/**
18+
* Отправить сообщение.
19+
*
20+
* @param string $codeEvent Код события.
21+
* @param array $arFields Параметры события.
22+
*
23+
* @return void
24+
* @throws ArgumentException | ObjectPropertyException | SystemException Битриксовые ошибки.
25+
*/
26+
public function send(string $codeEvent, array $arFields) : void;
27+
}

lib/Bitrix/Sender/BitrixMailEventSender.php

Lines changed: 7 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,7 @@
22

33
namespace Proklung\Notifier\Bitrix\Sender;
44

5-
use Bitrix\Main\ArgumentException;
6-
use Bitrix\Main\ObjectPropertyException;
7-
use Bitrix\Main\SystemException;
5+
use Proklung\Notifier\Bitrix\Contract\BitrixNotifierSenderInterface;
86
use Proklung\Notifier\Bitrix\EventBridgeMail;
97
use Proklung\Notifier\Bitrix\Utils\EventTableUpdater;
108
use Symfony\Component\Notifier\Notification\Notification;
@@ -17,7 +15,7 @@
1715
*
1816
* @since 28.07.2021
1917
*/
20-
class BitrixMailEventSender
18+
class BitrixMailEventSender implements BitrixNotifierSenderInterface
2119
{
2220
/**
2321
* @var EventBridgeMail $eventBridge Обработка битриксовых данных события.
@@ -54,29 +52,16 @@ public static function getInstance(NotifierInterface $notifier) : self
5452
}
5553

5654
/**
57-
* Отправить сообщение.
58-
*
59-
* @param string $codeEvent Код события.
60-
* @param array $arFields Параметры события.
61-
* @param string|null $importance Важность сообщения (в понимании Notifier).
62-
*
63-
* @return void
64-
* @throws ArgumentException | ObjectPropertyException | SystemException Битриксовые ошибки.
55+
* @inheritdoc
6556
*/
66-
public function send(string $codeEvent, array $arFields, ?string $importance = null) : void
57+
public function send(string $codeEvent, array $arFields) : void
6758
{
6859
$eventsInfo = $this->eventBridge->getMessageTemplate($codeEvent);
6960
foreach ($eventsInfo as $eventInfo) {
7061
$compileData = $this->eventBridge->compileMessage($eventInfo, $arFields, ['s1']);
7162

72-
if ($importance !== null) {
73-
$notification = (new Notification($compileData['subject']))
74-
->content($compileData['body'])
75-
->importance($importance);
76-
} else {
77-
$notification = (new Notification($compileData['subject'], ['email']))
78-
->content($compileData['body']);
79-
}
63+
$notification = (new Notification($compileData['subject'], ['email']))
64+
->content($compileData['body']);
8065

8166
$recipient = new Recipient($compileData['mail_to']);
8267

@@ -86,4 +71,4 @@ public function send(string $codeEvent, array $arFields, ?string $importance = n
8671
EventTableUpdater::create($eventInfo->getEventCode(), $eventInfo->getMessageData(), 99999);
8772
}
8873
}
89-
}
74+
}
Lines changed: 84 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,84 @@
1+
<?php
2+
3+
namespace Proklung\Notifier\Bitrix\Sender;
4+
5+
use Bitrix\Main\ArgumentException;
6+
use Bitrix\Main\ObjectPropertyException;
7+
use Bitrix\Main\SystemException;
8+
use Proklung\Notifier\Bitrix\EventBridgeMail;
9+
use Proklung\Notifier\Bitrix\Utils\EventTableUpdater;
10+
use Symfony\Component\Notifier\Notification\Notification;
11+
use Symfony\Component\Notifier\NotifierInterface;
12+
use Symfony\Component\Notifier\Recipient\Recipient;
13+
14+
/**
15+
* Class BitrixPolicySender
16+
* @package Proklung\Notifier\Bitrix\Sender
17+
*
18+
* @since 29.07.2021
19+
*/
20+
class BitrixPolicySender
21+
{
22+
/**
23+
* @var EventBridgeMail $eventBridge Обработка битриксовых данных события.
24+
*/
25+
private $eventBridge;
26+
27+
/**
28+
* @var NotifierInterface $notifier Notifier.
29+
*/
30+
private $notifier;
31+
32+
/**
33+
* BitrixMailEventSender constructor.
34+
*
35+
* @param EventBridgeMail $eventBridge Обработка битриксовых данных события.
36+
* @param NotifierInterface $notifier Notifier.
37+
*/
38+
public function __construct(EventBridgeMail $eventBridge, NotifierInterface $notifier)
39+
{
40+
$this->eventBridge = $eventBridge;
41+
$this->notifier = $notifier;
42+
}
43+
44+
/**
45+
* Статический фасад.
46+
*
47+
* @param NotifierInterface $notifier Notifier.
48+
*
49+
* @return static
50+
*/
51+
public static function getInstance(NotifierInterface $notifier) : self
52+
{
53+
return new static(new EventBridgeMail(), $notifier);
54+
}
55+
56+
/**
57+
* Отправить сообщение.
58+
*
59+
* @param string $codeEvent Код события.
60+
* @param array $arFields Параметры события.
61+
* @param string $importance Важность сообщения (в понимании Notifier).
62+
*
63+
* @return void
64+
* @throws ArgumentException | ObjectPropertyException | SystemException Битриксовые ошибки.
65+
*/
66+
public function send(string $codeEvent, array $arFields, string $importance) : void
67+
{
68+
$eventsInfo = $this->eventBridge->getMessageTemplate($codeEvent);
69+
foreach ($eventsInfo as $eventInfo) {
70+
$compileData = $this->eventBridge->compileMessage($eventInfo, $arFields, ['s1']);
71+
72+
$notification = (new Notification($compileData['subject']))
73+
->content($compileData['body'])
74+
->importance($importance);
75+
76+
$recipient = new Recipient($compileData['mail_to']);
77+
78+
$this->notifier->send($notification, $recipient);
79+
80+
// Эмуляция поведения Битрикса при обработке событий.
81+
EventTableUpdater::create($eventInfo->getEventCode(), $eventInfo->getMessageData(), 99999);
82+
}
83+
}
84+
}

lib/Bitrix/Sender/BitrixSmsSender.php

Lines changed: 4 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,11 @@
22

33
namespace Proklung\Notifier\Bitrix\Sender;
44

5-
use Bitrix\Main\ArgumentException;
6-
use Bitrix\Main\ObjectPropertyException;
7-
use Bitrix\Main\SystemException;
85
use Exception;
6+
use Proklung\Notifier\Bitrix\Contract\BitrixNotifierSenderInterface;
97
use Proklung\Notifier\Bitrix\EventBridgeSms;
108
use Proklung\Notifier\Bitrix\Utils\EventTableUpdater;
119
use RuntimeException;
12-
use Symfony\Component\Notifier\Exception\TransportExceptionInterface;
1310
use Symfony\Component\Notifier\Message\SmsMessage;
1411
use Symfony\Component\Notifier\TexterInterface;
1512

@@ -19,7 +16,7 @@
1916
*
2017
* @since 28.07.2021
2118
*/
22-
class BitrixSmsSender
19+
class BitrixSmsSender implements BitrixNotifierSenderInterface
2320
{
2421
/**
2522
* @var EventBridgeSms $eventBridge Обработка битриксовых данных события SMS.
@@ -56,14 +53,7 @@ public static function getInstance(TexterInterface $notifier): self
5653
}
5754

5855
/**
59-
* Отправить сообщение.
60-
*
61-
* @param string $codeEvent Код события.
62-
* @param array $arFields Параметры события.
63-
*
64-
* @return void
65-
* @throws ArgumentException | ObjectPropertyException | SystemException Битриксовые ошибки.
66-
* @throws TransportExceptionInterface Ошибки транспорта SMS.
56+
* @inheritdoc
6757
*/
6858
public function send(string $codeEvent, array $arFields): void
6959
{
@@ -93,4 +83,4 @@ public function send(string $codeEvent, array $arFields): void
9383

9484
EventTableUpdater::create($codeEvent, $fields, 99999, $success);
9585
}
96-
}
86+
}

lib/Bitrix/Sender/BitrixTelegramEventSender.php

Lines changed: 3 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -2,17 +2,14 @@
22

33
namespace Proklung\Notifier\Bitrix\Sender;
44

5-
use Bitrix\Main\ArgumentException;
6-
use Bitrix\Main\ObjectPropertyException;
7-
use Bitrix\Main\SystemException;
85
use League\HTMLToMarkdown\HtmlConverter;
6+
use Proklung\Notifier\Bitrix\Contract\BitrixNotifierSenderInterface;
97
use Proklung\Notifier\Bitrix\EventBridgeMail;
108
use Proklung\Notifier\Bitrix\Utils\EventTableUpdater;
119
use RuntimeException;
1210
use Symfony\Component\Notifier\Bridge\Telegram\TelegramOptions;
1311
use Symfony\Component\Notifier\Bridge\Telegram\TelegramTransport;
1412
use Symfony\Component\Notifier\ChatterInterface;
15-
use Symfony\Component\Notifier\Exception\TransportExceptionInterface;
1613
use Symfony\Component\Notifier\Message\ChatMessage;
1714

1815
/**
@@ -21,7 +18,7 @@
2118
*
2219
* @since 28.07.2021
2320
*/
24-
class BitrixTelegramEventSender
21+
class BitrixTelegramEventSender implements BitrixNotifierSenderInterface
2522
{
2623
/**
2724
* @var EventBridgeMail $eventBridge Обработка битриксовых данных события.
@@ -69,14 +66,7 @@ public static function getInstance(ChatterInterface $notifier) : self
6966
}
7067

7168
/**
72-
* Отправить сообщение.
73-
*
74-
* @param string $codeEvent Код события.
75-
* @param array $arFields Параметры события.
76-
*
77-
* @return void
78-
* @throws ArgumentException | ObjectPropertyException | SystemException Битриксовые ошибки.
79-
* @throws TransportExceptionInterface Ошибки транспорта.
69+
* @inheritdoc
8070
*/
8171
public function send(string $codeEvent, array $arFields) : void
8272
{

readme.MD

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -204,6 +204,25 @@ return [
204204

205205
Ошибки отправки не глушатся. Если что-то пойдет не так, то выбросится исключение.
206206

207+
### Отправка битриксового события согласно channel_policy
208+
209+
```php
210+
use Proklung\Notifier\Bitrix\Sender\BitrixPolicySender;
211+
use Symfony\Component\Notifier\Notification\Notification;;
212+
213+
/** @var BitrixPolicySender $bitrixEventHandler */
214+
$bitrixEventHandler = BitrixPolicySender::getInstance(
215+
\Proklung\Notifier\DI\Services::getInstance()->get('notifier')
216+
);
217+
218+
// Массив, идентичный с параметром fields при отправке Битриксом сообщений
219+
// См. https://dev.1c-bitrix.ru/api_help/main/reference/cevent/send.php
220+
$arFields = ['NAME' => 'testing email', 'EMAIL' => '[email protected]'];
221+
222+
// Будет оправлено сообщение в канал email и сделана запись в таблице b_event.
223+
$bitrixEventHandler->send('CODE_MAIL_EVENT', $arFields, Notification::IMPORTANCE_MEDIUM);
224+
```
225+
207226
### Использование битриксовых SMS событий и их шаблонов
208227

209228
```php

0 commit comments

Comments
 (0)