Цель: борьба с копипастой всякой мелочи между проектами. Содержит в основном мусорный legacy код, доставшийся в наследство от предыдущих поколений, но прижившийся.
INTERNAL
##Установка
composer.json:
"repositories": [
{
"type": "git",
"url": "https://github.com/proklung/bitrix-tools-pack-bundle"
}
]
composer require proklung/bitrix-tools-pack-bundle
Prokl\BitrixOrdinaryToolsBundle\Services\Facades\Container
- Экземпляр сервис-контейнераProkl\BitrixOrdinaryToolsBundle\Services\Facades\Application
- $APPLICATIONProkl\BitrixOrdinaryToolsBundle\Services\Facades\ApplicationD7
-Bitrix\Main\Application
Prokl\BitrixOrdinaryToolsBundle\Services\Facades\CMain
-CMain
Prokl\BitrixOrdinaryToolsBundle\Services\Facades\CUser
-CUser
Prokl\BitrixOrdinaryToolsBundle\Services\Facades\CUser
-CFile
Prokl\BitrixOrdinaryToolsBundle\Services\Facades\EventManager
-Bitrix\Main\EventManager
Prokl\BitrixOrdinaryToolsBundle\Services\Facades\EventMail
-Bitrix\Main\Mail\Event
Prokl\BitrixOrdinaryToolsBundle\Services\Logger\EventLogLogger
- monolog-логгер для записи логов в журнал событий /bitrix/admin/event_log.php?lang=ru.
Конфигурация Monolog Bundle:
monolog:
handlers:
myHandler:
type: service
id: Prokl\BitrixOrdinaryToolsBundle\Services\Logger\EventLogLogger
level: error
Использование:
use Monolog\Logger;
/** @var Logger $logger */
$logger = container()->get('public_logger');
$logger->error(
'Testing',
['context' => 'OK', 'MODULE_ID' => 'My module', 'ITEM_ID' => get_class($this)]
);
use Prokl\BitrixOrdinaryToolsBundle\Services\Email\EventBridge\Sender\BitrixMailEventSender;
/** @var BitrixMailEventSender $bitrixEventHandler */
$bitrixEventHandler = container()->get('notifier_bitrix_event_sender.mail');
// Массив, идентичный с параметром fields при отправке Битриксом сообщений
// См. https://dev.1c-bitrix.ru/api_help/main/reference/cevent/send.php
$arFields = ['NAME' => 'testing email', 'EMAIL' => '[email protected]'];
// Будет оправлено сообщение в канал email и сделана запись в таблице b_event.
$bitrixEventHandler->send('CODE_MAIL_EVENT', $arFields);
Ошибки отправки не глушатся. Если что-то пойдет не так, то выбросится исключение.
При условии channel_policy
в конфиге framework.yaml
:
'channel_policy':
medium: ['email', 'chat/telegram'],
use Prokl\BitrixOrdinaryToolsBundle\Services\Email\EventBridge\Sender\BitrixPolicySender;
use Symfony\Component\Notifier\Notification\Notification;;
/** @var BitrixPolicySender $bitrixEventHandler */
$bitrixEventHandler = container()->get('notifier_bitrix_event_sender.policy');
// Массив, идентичный с параметром fields при отправке Битриксом сообщений
// См. https://dev.1c-bitrix.ru/api_help/main/reference/cevent/send.php
$arFields = ['NAME' => 'testing email', 'EMAIL' => '[email protected]'];
// Будет оправлено сообщение в канал email и сделана запись в таблице b_event.
$bitrixEventHandler->send('CODE_MAIL_EVENT', $arFields, Notification::IMPORTANCE_MEDIUM);
use Prokl\BitrixOrdinaryToolsBundle\Services\Email\EventBridge\Sender\BitrixSmsSender;
/** @var BitrixSmsSender $bitrixEventHandler */
$bitrixEventHandler = container()->get('notifier_bitrix_event_sender.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
появится запись с признаком неудачи и текстом ошибки.
use Prokl\BitrixOrdinaryToolsBundle\Services\Email\EventBridge\Sender\BitrixTelegramEventSender;
/** @var BitrixTelegramEventSender $bitrixEventHandler */
$bitrixEventHandler = container()->get('notifier_bitrix_event_sender.telegram');
$arFields = ['CODE' => '2222', 'LINK' => 'http://site.loc/'];
$bitrixEventHandler->send('TEST_EVENT', $arFields);
Должен быть установлен symfony/telegram-notifier
и зарегистрирован транспорт telegram
.
Нюанс:
- Telegram плохо переваривает html (даже в режиме
parse_mode = html
). Посему под капотом html шаблона превращается в markdown разметку.
Symfony Notifier должен быть сконфигурирован в framework.yaml
.
/bitrix/.settings.php
:
Работает при условии установки бандла.
use Symfony\Component\Notifier\Notification\Notification;
return [
'exception_handling' =>
array(
'value' =>
array(
'debug' => env('DEBUG', false),
'handled_errors_types' => 4437,
'exception_errors_types' => 4437,
'ignore_silence' => false,
'assertion_throws_exception' => true,
'assertion_error_type' => 256,
'log' => array (
'class_name' => \Prokl\BitrixOrdinaryToolsBundle\Services\ErrorHandler\ErrorHandler::class,
'required_file' => 'vendor/proklung/bitrix-tools-pack-bundle/Services/ErrorHandler/ErrorHandler/ErrorHandler.php',
'settings' => array (
'types' => [
\Bitrix\Main\Diag\ExceptionHandlerLog::UNCAUGHT_EXCEPTION,
\Bitrix\Main\Diag\ExceptionHandlerLog::IGNORED_ERROR,
\Bitrix\Main\Diag\ExceptionHandlerLog::FATAL,
],
// Получатель почты; перебивает параметры родительского модуля
'recipient' => '[email protected]',
// Или какой-нибудь иной способ различения dev/prod среды
// По умолчанию - dev
'env' => env('DEBUG', false) ? 'dev' : 'prod',
// В каком окружении работать. По умолчанию - prod.
'allowed_env' => ['dev', 'prod'],
// Уровень важности согласно channel_policy (см. документацию к модулю proklung.notifier)
// По умолчанию - urgent
'importancy' => Notification::IMPORTANCE_URGENT,
),
),
),
'readonly' => false,
),
];
- Сообщение об ошибке рассылается всего один раз (иначе чревато флудом). Каждые сутки таблица с информацией об отправленных уведомлениях очищается посредством агента. Процесс начинается по новой.
Форкнуто из модуля.
framework.yaml
:
messenger:
enabled: true
transports:
async: "%env(MESSENGER_TRANSPORT_DSN)%"
bitrix: 'bitrix://default?queue_name=messages'
routing:
'Local\Services\Messanger\SmsNotification': bitrix
Consume:
php bin/console messenger:consume bitrix
Для команды php bin/console cache:warmup
-
RouterCacheWarm - прогрев кэша роутера (если таковой присутствует).
-
BitrixCacheWarmer - прогрев кэша статических страниц по списку.
Список определяется переменной контейнера warming_pages
в корневом проекте:
parameters:
warming_pages:
- '/'
- '/news/'
Если такой переменной нет, то прогревается только главная (/
) страница.
- Проверка - отправляется электронная почта или нет
php bin/console bitrix:check-send-email