Skip to content

Commit 1d7511b

Browse files
committed
Первый коммит
0 parents  commit 1d7511b

25 files changed

+1886
-0
lines changed

.gitignore

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
.idea
2+
/vendor/
3+
vendor/
4+
composer.lock
5+
*.php.meta

composer.json

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
{
2+
"name": "proklung/bitrix.notifier.module",
3+
"description": "Интеграция компонента Symfony Notifier в Битрикс",
4+
"type": "bitrix-d7-module",
5+
"keywords": [
6+
"bitrix",
7+
"bitrix-module",
8+
"bitrix-cms",
9+
"bitrix-d7",
10+
"symfony",
11+
"bitrix-symfony",
12+
"notifier"
13+
],
14+
"homepage": "https://github.com/ProklUng/bitrix.notifier.module",
15+
"license": "MIT",
16+
"authors": [
17+
{
18+
"name": "Gavrilov Fedy",
19+
"email": "fedor.gavrilov.75@mail.ru"
20+
}
21+
],
22+
23+
"repositories": [
24+
{
25+
"type": "git",
26+
"url": "https://github.com/proklung/bitrix.containerable.boilerplate"
27+
}
28+
],
29+
30+
"support": {
31+
"issues": "https://github.com/ProklUng/bitrix.notifier.module/issues",
32+
"source": "https://github.com/ProklUng/bitrix.notifier.module"
33+
},
34+
"extra": {
35+
"installer-name": "proklung.notifier"
36+
},
37+
"require": {
38+
"php": ">=7.1 || ^8.0",
39+
"composer/installers": "~1",
40+
"symfony/notifier": "^5",
41+
"symfony/http-foundation": "^4.4 || ^5",
42+
"symfony/event-dispatcher": "^4.4 || ^5",
43+
"symfony/mailer": "^4.4 || ^5.0",
44+
"symfony/google-mailer": "^4.4 || ^5.0",
45+
"symfony/mime": "^4.4 || ^5.0",
46+
"symfony/monolog-bridge": "^5",
47+
"twig/twig": "~1 | ~2",
48+
"proklung/bitrix-containerable-boilerplate": "^1.0",
49+
"proklung/bitrix.module.boilerplate": "^1.0",
50+
"ext-json": "*"
51+
},
52+
"require-dev": {
53+
"icanhazstring/composer-unused": "^0.7.5"
54+
}
55+
}

configs/mailer.yaml

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
services:
2+
_defaults:
3+
autowire: true
4+
autoconfigure: true
5+
public: true
6+
7+
mailer:
8+
class: Symfony\Component\Mailer\Mailer
9+
arguments: ['@mailer.transports', ~, '@event_dispatcher']
10+
11+
mailer_debug:
12+
class: Symfony\Component\Mailer\Mailer
13+
arguments: ['@mailer.transport_factory.filesystem', ~, '@event_dispatcher']
14+
15+
Symfony\Component\Mailer\MailerInterface: '@mailer'
16+
17+
mailer.transport_factory:
18+
class: Symfony\Component\Mailer\Transport
19+
arguments: [!tagged { tag: mailer.transport_factory }]
20+
21+
mailer.transports:
22+
class: Symfony\Component\Mailer\Transport\Transports
23+
factory: ['@mailer.transport_factory', 'fromStrings']
24+
arguments:
25+
- [ '%mailer_dsn%' ]
26+
27+
mailer.default_transport:
28+
class: Symfony\Component\Mailer\Transport\TransportInterface
29+
factory: ['@mailer.transport_factory', 'fromString']
30+
arguments: ['%mailer_dsn%']
31+
32+
Symfony\Component\Mailer\Transport\TransportInterface: '@mailer.default_transport'
33+
34+
mailer.messenger.message_handler:
35+
class: Symfony\Component\Mailer\Messenger\MessageHandler
36+
arguments: ['@mailer.transports']
37+
tags:
38+
- { name: messenger.message_handler }
39+
40+
mailer.envelope_listener:
41+
class: Symfony\Component\Mailer\EventListener\EnvelopeListener
42+
tags:
43+
- { name: kernel.event_subscribe }
44+
45+
mailer.logger_message_listener:
46+
class: Symfony\Component\Mailer\EventListener\MessageLoggerListener
47+
tags:
48+
- { name: kernel.event_subscriber }
49+
- { name: kernel.reset, method: reset }
50+
51+
mailer.transport_factory.abstract:
52+
class: Symfony\Component\Mailer\Transport\AbstractTransportFactory
53+
abstract: true
54+
arguments:
55+
- '@event_dispatcher'
56+
- '@http_client'

configs/mailer_custom.yaml

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
services:
2+
_defaults:
3+
autowire: true
4+
autoconfigure: true
5+
public: true
6+
7+
# Транспорт - запись писем в файл.
8+
custom_mailer_transports.filesystem:
9+
class: Symfony\Component\Mailer\Transport\TransportInterface
10+
factory: '@Prokl\CustomFrameworkExtensionsBundle\Services\Mailer\Factory\TransportFactory'
11+
arguments:
12+
- '%mailer_dsn_file%'
13+
- '@mailer.filesystem'
14+
- '@event_dispatcher'
15+
- '@http_client'
16+
17+
# Сервис-обертка отправки писем.
18+
custom_mail_sender:
19+
class: Prokl\CustomFrameworkExtensionsBundle\Services\Mailer\EmailService
20+
arguments:
21+
- '@mailer'
22+
- '@Symfony\Bridge\Twig\Mime\BodyRenderer'
23+
24+
Prokl\CustomFrameworkExtensionsBundle\Services\Mailer\EmailService: '@custom_mail_sender'
25+
26+
Symfony\Bridge\Twig\Mime\BodyRenderer:
27+
class: Symfony\Bridge\Twig\Mime\BodyRenderer
28+
arguments: ['@twig.instance']
29+
30+
Symfony\Component\Mime\BodyRendererInterface: '@Symfony\Bridge\Twig\Mime\BodyRenderer'
31+
32+
# Кастомная фабрика транспортов.
33+
Prokl\CustomFrameworkExtensionsBundle\Services\Mailer\Factory\TransportFactory:
34+
arguments:
35+
- '%kernel.project_dir%'
36+
37+
# Тестовый сервис отправки почты через MailerMessageFactory
38+
mailer_bundle.send_email_via_factory:
39+
class: Prokl\CustomFrameworkExtensionsBundle\Services\Mailer\Factory\MailerMessageFactory
40+
arguments:
41+
$documentRoot: '%kernel.project_dir%'
42+
$defaultSettings:
43+
from: '%mailer_default_email_from%'
44+
cc: []
45+
bcc: []
46+
replyTo: '%mailer_default_email_from%'
47+
headers: []
48+
49+
50+
################
51+
# Listeners
52+
################
53+
54+
Prokl\CustomFrameworkExtensionsBundle\Services\Mailer\Events\SetFromListener:
55+
arguments: ['%mailer_default_email_from%', '%mailer_default_title%']
56+
tags:
57+
- { name: kernel.event_subscriber }

configs/mailer_transports.yaml

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
services:
2+
_defaults:
3+
autowire: true
4+
autoconfigure: true
5+
public: true
6+
7+
mailer.transport_factory.gmail:
8+
public: true
9+
autowire: true
10+
autoconfigure: false
11+
class: Symfony\Component\Mailer\Bridge\Google\Transport\GmailTransportFactory
12+
parent: mailer.transport_factory.abstract
13+
tags:
14+
- { name: mailer.transport_factory }
15+
16+
mailer.filesystem:
17+
public: false
18+
class: Symfony\Component\Filesystem\Filesystem
19+
20+
# Кастомная фабрика транспортов файловой системы.
21+
mailer.transport_factory.filesystem:
22+
public: true
23+
class: Prokl\CustomFrameworkExtensionsBundle\Services\Mailer\Transport\FileTransport
24+
arguments:
25+
- '%kernel.project_dir%/'
26+
- '@mailer.filesystem'
27+
- []
28+
- '@event_dispatcher'
29+
tags:
30+
- { name: mailer.transport_factory }
31+
32+
mailer.transport_factory.smtp:
33+
public: true
34+
autowire: true
35+
autoconfigure: false
36+
class: Symfony\Component\Mailer\Transport\Smtp\EsmtpTransportFactory
37+
parent: "mailer.transport_factory.abstract"
38+
tags:
39+
- { name: mailer.transport_factory, priority: -100 }

configs/notifier.php

Lines changed: 128 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,128 @@
1+
<?php
2+
3+
namespace Symfony\Component\DependencyInjection\Loader\Configurator;
4+
5+
use Proklung\Notifier\Email\CustomEmailChannel;
6+
use Symfony\Bridge\Monolog\Handler\NotifierHandler;
7+
use Symfony\Component\EventDispatcher\EventDispatcher;
8+
use Symfony\Component\HttpFoundation\RequestStack;
9+
use Symfony\Component\Mailer\Mailer;
10+
use Symfony\Component\Notifier\Channel\BrowserChannel;
11+
use Symfony\Component\Notifier\Channel\ChannelPolicy;
12+
use Symfony\Component\Notifier\Channel\ChatChannel;
13+
use Symfony\Component\Notifier\Channel\EmailChannel;
14+
use Symfony\Component\Notifier\Channel\SmsChannel;
15+
use Symfony\Component\Notifier\Chatter;
16+
use Symfony\Component\Notifier\ChatterInterface;
17+
use Symfony\Component\Notifier\EventListener\NotificationLoggerListener;
18+
use Symfony\Component\Notifier\EventListener\SendFailedMessageToNotifierListener;
19+
use Symfony\Component\Notifier\Message\ChatMessage;
20+
use Symfony\Component\Notifier\Message\SmsMessage;
21+
use Symfony\Component\Notifier\Messenger\MessageHandler;
22+
use Symfony\Component\Notifier\Notifier;
23+
use Symfony\Component\Notifier\NotifierInterface;
24+
use Symfony\Component\Notifier\Texter;
25+
use Symfony\Component\Notifier\TexterInterface;
26+
use Symfony\Component\Notifier\Transport;
27+
use Symfony\Component\Notifier\Transport\Transports;
28+
use Twig\Extra\CssInliner\CssInlinerExtension;
29+
use Twig\Extra\Inky\InkyExtension;
30+
31+
return static function (ContainerConfigurator $container) {
32+
// Mailer должен присутствовать.
33+
if (class_exists(Mailer::class)) {
34+
$missingPackages = [];
35+
if (!class_exists(CssInlinerExtension::class)) {
36+
$missingPackages['twig/cssinliner-extra'] = ' CSS Inliner';
37+
}
38+
39+
if (!class_exists(InkyExtension::class)) {
40+
$missingPackages['twig/inky-extra'] = 'Inky';
41+
}
42+
43+
$classEmailChannel = count($missingPackages) === 0 ? EmailChannel::class : CustomEmailChannel::class;
44+
45+
$container->services()
46+
->set('notifier.channel.email', $classEmailChannel)
47+
->args([service('mailer.transports'),
48+
service('messenger.default_bus')->ignoreOnInvalid(),
49+
$classEmailChannel === CustomEmailChannel::class ? param('default_sender_email') : null
50+
])
51+
->tag('notifier.channel', ['channel' => 'email']);
52+
}
53+
54+
$container->services()
55+
->set('request_stack', RequestStack::class)
56+
->set('event_dispatcher', EventDispatcher::class)
57+
58+
->set('notifier', Notifier::class)
59+
->args([tagged_locator('notifier.channel', 'channel'), service('notifier.channel_policy')->ignoreOnInvalid()])
60+
->public()
61+
->alias(NotifierInterface::class, 'notifier')
62+
63+
->set('notifier.channel_policy', ChannelPolicy::class)
64+
->args([[]])
65+
66+
->set('notifier.channel.browser', BrowserChannel::class)
67+
->args([service('request_stack')])
68+
->tag('notifier.channel', ['channel' => 'browser'])
69+
70+
->set('notifier.channel.chat', ChatChannel::class)
71+
->args([service('chatter.transports'), service('messenger.default_bus')->ignoreOnInvalid()])
72+
->tag('notifier.channel', ['channel' => 'chat'])
73+
74+
->set('notifier.channel.sms', SmsChannel::class)
75+
->args([service('texter.transports'), service('messenger.default_bus')->ignoreOnInvalid()])
76+
->tag('notifier.channel', ['channel' => 'sms'])
77+
78+
->set('notifier.monolog_handler', NotifierHandler::class)
79+
->args([service('notifier')])
80+
81+
->set('notifier.failed_message_listener', SendFailedMessageToNotifierListener::class)
82+
->args([service('notifier')])
83+
84+
->set('chatter', Chatter::class)
85+
->args([
86+
service('chatter.transports'),
87+
service('messenger.default_bus')->ignoreOnInvalid(),
88+
service('event_dispatcher')->ignoreOnInvalid(),
89+
])
90+
->public()
91+
->alias(ChatterInterface::class, 'chatter')
92+
93+
->set('chatter.transports', Transports::class)
94+
->factory([service('chatter.transport_factory'), 'fromStrings'])
95+
->args([[]])
96+
97+
->set('chatter.transport_factory', Transport::class)
98+
->args([tagged_iterator('chatter.transport_factory')])
99+
100+
->set('chatter.messenger.chat_handler', MessageHandler::class)
101+
->args([service('chatter.transports')])
102+
->tag('messenger.message_handler', ['handles' => ChatMessage::class])
103+
104+
->set('texter', Texter::class)
105+
->args([
106+
service('texter.transports'),
107+
service('messenger.default_bus')->ignoreOnInvalid(),
108+
service('event_dispatcher')->ignoreOnInvalid(),
109+
])
110+
->public()
111+
112+
->alias(TexterInterface::class, 'texter')
113+
114+
->set('texter.transports', Transports::class)
115+
->factory([service('texter.transport_factory'), 'fromStrings'])
116+
->args([[]])
117+
118+
->set('texter.transport_factory', Transport::class)
119+
->args([tagged_iterator('texter.transport_factory')])
120+
121+
->set('texter.messenger.sms_handler', MessageHandler::class)
122+
->args([service('texter.transports')])
123+
->tag('messenger.message_handler', ['handles' => SmsMessage::class])
124+
125+
->set('notifier.logger_notification_listener', NotificationLoggerListener::class)
126+
->tag('kernel.event_subscriber')
127+
;
128+
};

0 commit comments

Comments
 (0)