Skip to content

Commit fc7f14c

Browse files
committed
Initial commit
0 parents  commit fc7f14c

40 files changed

+3476
-0
lines changed

.gitignore

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
.idea
2+
/vendor/
3+
composer.lock
4+
.phpunit.result.cache

composer.json

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
{
2+
"name": "proklung/bitrix-core-symfony",
3+
"description": "Core Symfony functionality for Bitrix",
4+
"type": "library",
5+
"license": "MIT",
6+
"authors": [
7+
{
8+
"name": "Gavrilov Fedy",
9+
"email": "fedor.gavrilov.75@mail.ru"
10+
}
11+
],
12+
13+
"support": {
14+
"issues": "https://github.com/ProklUng/bitrix.core.symfony/issues",
15+
"source": "https://github.com/ProklUng/bitrix.core.symfony"
16+
},
17+
"autoload": {
18+
"psr-4": {
19+
"Prokl\\ServiceProvider\\": "src",
20+
"Prokl\\ServiceProvider\\Tests\\": "tests"
21+
},
22+
"files": [
23+
"functions/container.php"
24+
]
25+
},
26+
"repositories": [
27+
28+
],
29+
"require": {
30+
"php": ">=7.3 | ~8",
31+
"symfony/dependency-injection": "^4.0 || ^5.0",
32+
"symfony/http-kernel": "^4.0 || ^5.0",
33+
"symfony/config": "~4|~5",
34+
"symfony/framework-bundle": "^4.0 || ^5.0",
35+
"symfony/filesystem": "^4.0 || ^5.0",
36+
"symfony/routing": "^4.0 || ^5.0",
37+
"symfony/http-foundation": "^4.0 || ^5.0",
38+
"symfony/event-dispatcher": "^4.0 || ^5.0",
39+
"symfony/property-access": "^4.0 || ^5.0",
40+
"symfony/serializer": "^4.0 || ^5.0",
41+
"symfony/console": "^4.0 || ^5.0",
42+
"symfony/cache": "^4.0 || ^5.0",
43+
"symfony/http-client": "^4.0 || ^5.0",
44+
"symfony/proxy-manager-bridge": "^4.0 || ^5.0",
45+
"symfony/validator": "^4.0 || ^5.0",
46+
"symfony/dotenv": "^4.0 || ^5.0",
47+
"symfony/expression-language": "4.0 || ^5.0",
48+
"proklung/base-exception": "^1.0"
49+
},
50+
"require-dev": {
51+
"proklung/bitrix-phpunit-testing-tools": "^1.1"
52+
}
53+
}

config/base.yaml

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
services:
2+
# конфигурация по умолчанию в *этом* файле
3+
_defaults:
4+
autowire: true
5+
autoconfigure: true
6+
public: true
7+
8+
Prokl\ServiceProvider\ServiceProvider: ~
9+
10+
# Прямой алиас сервис-контейнера Symfony. @service_container - deprecated.
11+
Psr\Container\ContainerInterface: '@service_container'
12+
13+
# Ядро.
14+
Symfony\Component\HttpKernel\KernelInterface: '@kernel'
15+
Symfony\Component\HttpKernel\Kernel: '@kernel'
16+
17+
# Параметры приложения.
18+
parameter_bag:
19+
class: Symfony\Component\DependencyInjection\ParameterBag\ContainerBag
20+
arguments: ["@service_container"]
21+
22+
# Параметры приложения. Алиас.
23+
Symfony\Component\DependencyInjection\ParameterBag\ContainerBagInterface: '@parameter_bag'
24+
Symfony\Component\DependencyInjection\ParameterBag\ParameterBagInterface: '@parameter_bag'
25+
26+
# Запрос.
27+
app.request:
28+
class: Prokl\ServiceProvider\Services\AppRequest
29+
tags: ['service.bootstrap']
30+
31+
Prokl\ServiceProvider\Services\AppRequest: '@app.request'
32+
request: '@app.request'
33+
34+
# Request приложения.
35+
global.request:
36+
class: Symfony\Component\HttpFoundation\Request
37+
factory: ['@app.request', 'getRequest']
38+
39+
# Текущий URL.
40+
app.request.uri:
41+
class: Prokl\ServiceProvider\Services\AppRequest
42+
factory: ['@app.request', 'getRequestUri']
43+
44+
#############
45+
# Wordpress
46+
#############
47+
48+
# Регистратор кастомных типов постов.
49+
custom.post.type.registrator:
50+
class: Prokl\ServiceProvider\Services\PostTypes\PostTypeRegistrator
51+
tags:
52+
- { name: 'post.type.registrator'}
53+
54+
Prokl\ServiceProvider\Services\PostTypes\PostTypeRegistrator: '@custom.post.type.registrator'

functions/container.php

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
<?php
2+
3+
use Prokl\ServiceProvider\ServiceProvider;
4+
use Symfony\Component\DependencyInjection\Container;
5+
6+
if (!function_exists('container')) {
7+
/**
8+
* Экземпляр сервис-контейнера Symfony.
9+
*
10+
* @param string|object $classContainer Класс контейнера.
11+
*
12+
* @return Container
13+
*
14+
* @since 21.03.2021 Класс (или объект) контейнера как параметр.
15+
*/
16+
function container($classContainer = ServiceProvider::class)
17+
{
18+
$container = $classContainer::instance();
19+
if ($container === null) {
20+
throw new RuntimeException(
21+
'Service container '. is_object($classContainer) ? get_class($classContainer) : $classContainer.
22+
' not initialized.'
23+
);
24+
}
25+
26+
return $container;
27+
}
28+
}

readme.MD

Lines changed: 139 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,139 @@
1+
# Базовый функционал для внедрения Symfony в Битрикс
2+
3+
## Установка
4+
5+
composer.json:
6+
7+
```json
8+
"repositories": [
9+
{
10+
"type": "git",
11+
"url": "https://github.com/proklung/bitrix.core.symfony"
12+
}
13+
]
14+
```
15+
16+
```bash
17+
composer require proklung/bitrix.core.symfony
18+
```
19+
20+
## Инициализация
21+
22+
В `init.php`:
23+
24+
```php
25+
use Prokl\ServiceProvider\ServiceProvider;
26+
27+
$serviceProvider = new ServiceProvider('local/configs/services.yaml');
28+
29+
```
30+
## Конфигурирование
31+
32+
1) Опция `compile.container` в подтягиваемом конфиге - компилировать ли контейнер в файл. Если не задана, то "нет, не компилировать".
33+
Имеет смысл для окружения, не равного "dev". Т.е. опция управляет дампированием контейнера на проде.
34+
35+
Место, где хранятся дампы контейнеров: `/bitrix/cache/s1/containers`
36+
37+
## Поддержка бандлов
38+
39+
Файл конфигурации - `/config/standalone_bundles.php`.
40+
41+
Папка, где лежат конфигурации - `/local/configs`. Конфигурации бандлов - `/local/configs/packages`.
42+
43+
## Сепаратные микро-контейнеры
44+
45+
Отдельные контейнеры - со своим конфигом, полностью изолированные (для модулей и т.п.).
46+
47+
```php
48+
use Symfony\Component\DependencyInjection\ContainerBuilder;
49+
use Prokl\ServiceProvider\Micro\AbstractStandaloneServiceProvider;
50+
51+
class ExampleMicroServiceProvider extends AbstractStandaloneServiceProvider
52+
{
53+
/**
54+
* @var ContainerBuilder $containerBuilder Контейнер.
55+
*/
56+
protected static $containerBuilder;
57+
58+
/**
59+
* @var string $pathBundlesConfig Путь к конфигурации бандлов.
60+
*/
61+
protected $pathBundlesConfig = '/src/Micro/example.config/standalone_bundles.php';
62+
63+
/**
64+
* @var string $configDir Папка, где лежат конфиги.
65+
*/
66+
protected $configDir = '/src/Micro/example.config/example.config/example.yaml';
67+
}
68+
```
69+
70+
Где надо - инициализация:
71+
72+
```php
73+
$micro = new ExampleMicroServiceProvider('src/SymfonyDI/Micro/example.config/example.yaml');
74+
```
75+
76+
Хэлпер `container` заточен под работу с микро-сервис-провайдерами:
77+
78+
```php
79+
var_dump(container($micro)->getParameter('example'));
80+
```
81+
82+
## Автозапуск сервисов
83+
84+
Чтобы сервис запустился автоматически после инициализации контейнера, он должен быть помечен тэгом `service.bootstrap`.
85+
86+
```yaml
87+
app.options:
88+
class: Prokl\Services\AppOptions
89+
arguments: ['%kernel.environment%', '@parameter_bag']
90+
tags: ['service.bootstrap']
91+
```
92+
93+
## Автоматическая подвязка на события Битрикс
94+
95+
Тэг: `bitrix.events.init`.
96+
97+
1) `event` - название события.
98+
2) `method` - метод-обработчик в сервисе
99+
3) `module` - модуль события
100+
4) `sort` - сортировка
101+
102+
```yaml
103+
admin_entity_edit.event_init:
104+
class: Local\Bitrix\PsModuleInitializer
105+
tags:
106+
- { name: bitrix.events.init, module: ps.d7, event: onGetEntityList, method: registerEntities, sort: 0 }
107+
```
108+
109+
## Автоматическое подхватывание расширений Twig
110+
111+
Посредством Timber. Тэг `twig.extension`.
112+
113+
```yaml
114+
service.twig.parameter:
115+
class: Prokl\Bundles\ParameterBundle\Twig\ParameterExtension
116+
public: true
117+
arguments:
118+
- '@service.parameter'
119+
tags:
120+
- { name: twig.extension }
121+
```
122+
123+
## Сервисы по умолчанию
124+
125+
Автоматом регистрируются несколько сервисов:
126+
127+
- `service_container` (и alias) - сервис-контейнер целиком
128+
- `app.request` - конвертор глобалов в Request
129+
- `custom.post.type.registrator` - регистратор кастомных типов постов в Wordpress
130+
- синонимы сервиса `kernel`.
131+
132+
133+
## Хэлперы
134+
135+
1) `container()` - отдает экземпляр контейнера (выступает в роли сервис-локатора):
136+
137+
```php
138+
$kernel = container()->get('kernel');
139+
```

0 commit comments

Comments
 (0)