proklung/bitrix-tools-pack-bundle

适用于 Symfony+Bitrix 的普通工具包。

1.8.2 2021-08-28 06:36 UTC

README

目标:对抗项目间各种小事情的复制粘贴。主要包含从上一代继承下来的垃圾遗留代码,但已经适应了。

内部

##安装

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 - $APPLICATION
  • Prokl\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)]
        );

使用 Bitrix 邮件事件及其模板

        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' => 'recipitient@gmail.com'];

        // Будет оправлено сообщение в канал email и сделана запись в таблице b_event.
        $bitrixEventHandler->send('CODE_MAIL_EVENT', $arFields);

发送错误不会被静默处理。如果出现问题,则会抛出异常。

根据 channel_policy 发送 Bitrix 事件

如果配置了 channel_policyframework.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' => 'recipitient@gmail.com'];

        // Будет оправлено сообщение в канал email и сделана запись в таблице b_event.
        $bitrixEventHandler->send('CODE_MAIL_EVENT', $arFields, Notification::IMPORTANCE_MEDIUM);

使用 Bitrix SMS 事件及其模板

        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 表中记录失败标志和错误文本,但不会抛出异常。

将 Bitrix 邮件模板发送到 Telegram

        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@gmail.com',
                            // Или какой-нибудь иной способ различения 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,
        ),
];

细节

  1. 错误消息只会发送一次(否则可能导致垃圾邮件)。每天通过代理清除发送通知信息的表格,过程重新开始。

通过 Bitrix D7 的 Symfony Messenger 传输

模块 分支。

framework.yaml:

  messenger:
    enabled: true
    transports:
      async: "%env(MESSENGER_TRANSPORT_DSN)%"
      bitrix: 'bitrix://default?queue_name=messages'
    routing:
      'Local\Services\Messanger\SmsNotification': bitrix

消费

php bin/console messenger:consume bitrix

缓存预热器

用于命令 php bin/console cache:warmup

  • RouterCacheWarm - 预热路由器缓存(如果存在)。

  • BitrixCacheWarmer - 根据列表预热静态页面缓存。

列表由根项目中的容器变量 warming_pages 定义

parameters:
  warming_pages:
    - '/'
    - '/news/'

如果没有这样的变量,则只预热主页 (/)。

控制台命令

  1. 检查是否发送了电子邮件
php bin/console bitrix:check-send-email