Skip to content

Commit dae759c

Browse files
committed
Доработка AppKernel. Теперь отдается правильный экземпляр контейнера.
1 parent d2738f0 commit dae759c

16 files changed

+603
-29
lines changed

composer.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,8 @@
5050
"vlucas/phpdotenv": "3.* || 4.*"
5151
},
5252
"require-dev": {
53-
"proklung/bitrix-phpunit-testing-tools": "^1.1"
53+
"proklung/bitrix-phpunit-testing-tools": "^1.1",
54+
"icanhazstring/composer-unused": "^0.7.5"
5455
},
5556
"extra": {
5657
"installer-paths": {

readme.MD

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,7 @@ parameters:
8888
```php
8989
use Symfony\Component\DependencyInjection\ContainerBuilder;
9090
use Prokl\ServiceProvider\Micro\AbstractStandaloneServiceProvider;
91+
use Prokl\ServiceProvider\Micro\ExampleAppKernel;
9192
9293
class ExampleMicroServiceProvider extends AbstractStandaloneServiceProvider
9394
{
@@ -105,6 +106,28 @@ class ExampleMicroServiceProvider extends AbstractStandaloneServiceProvider
105106
* @var string $configDir Папка, где лежат конфиги.
106107
*/
107108
protected $configDir = '/src/Micro/example.config/example.config/example.yaml';
109+
110+
/**
111+
* @var string $kernelServiceClass Класс, реализующий сервис kernel.
112+
* Нужен для того, чтобы экземпляры контейнеров в kernel сервисе не перемешивались.
113+
*/
114+
protected $kernelServiceClass = ExampleAppKernel::class;
115+
116+
}
117+
```
118+
119+
Пример класса `ExampleAppKernel`:
120+
121+
```php
122+
/**
123+
* Class ExampleAppKernel
124+
* @package Prokl\ServiceProvider\Micro
125+
*/
126+
use Prokl\ServiceProvider\Micro\AbstractKernel;
127+
128+
class ExampleAppKernel extends AbstractKernel
129+
{
130+
protected static $kernelContainer;
108131
}
109132
```
110133

src/Micro/AbstractKernel.php

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
<?php
2+
3+
namespace Prokl\ServiceProvider\Micro;
4+
5+
use Prokl\ServiceProvider\Services\AppKernel;
6+
7+
/**
8+
* Class AbstractKernel
9+
* @package Prokl\ServiceProvider\Micro
10+
*/
11+
class AbstractKernel extends AppKernel
12+
{
13+
protected static $kernelContainer;
14+
}

src/Micro/AbstractStandaloneServiceProvider.php

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -29,9 +29,12 @@ class AbstractStandaloneServiceProvider extends ServiceProvider
2929
/**
3030
* @inheritDoc
3131
*/
32-
public function __construct(string $filename)
33-
{
32+
public function __construct(
33+
string $filename,
34+
?string $pathBundlesConfig = null
35+
) {
3436
$this->symfonyCompilerClass = SymfonyCompilerPassBagLight::class;
35-
parent::__construct($filename);
37+
38+
parent::__construct($filename, $pathBundlesConfig);
3639
}
3740
}

src/Micro/ExampleAppKernel.php

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
<?php
2+
3+
namespace Prokl\ServiceProvider\Micro;
4+
5+
/**
6+
* Class ExampleAppKernel
7+
* @package Prokl\ServiceProvider\Micro
8+
*
9+
* @since 11.07.2021
10+
*/
11+
class ExampleAppKernel extends AbstractKernel
12+
{
13+
protected static $kernelContainer;
14+
}
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
<?php
2+
3+
namespace Prokl\ServiceProvider\Micro;
4+
5+
use Symfony\Component\DependencyInjection\ContainerBuilder;
6+
7+
/**
8+
* Class ExampleMicroServiceProvider
9+
* @package Prokl\ServiceProvider\Micro
10+
*
11+
* Пример микро-сервиспровайдера (для модулей и т.п.)
12+
*
13+
* @since 04.03.2021
14+
*/
15+
class ExampleMicroServiceProvider extends AbstractStandaloneServiceProvider
16+
{
17+
/**
18+
* @var ContainerBuilder $containerBuilder Контейнер.
19+
*/
20+
protected static $containerBuilder;
21+
22+
/**
23+
* @var string $pathBundlesConfig Путь к конфигурации бандлов.
24+
*/
25+
protected $pathBundlesConfig = '/src/SymfonyDI/Micro/example.config/standalone_bundles.php';
26+
27+
/**
28+
* @var string $configDir Папка, где лежат конфиги.
29+
*/
30+
protected $configDir = '/src/SymfonyDI/Micro/example.config/example.yaml';
31+
32+
/**
33+
* @var string $kernelServiceClass Класс, реализующий сервис kernel.
34+
*/
35+
protected $kernelServiceClass = ExampleAppKernel::class;
36+
}
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
parameters:
2+
example: 'Example parameter'
3+
services:
4+
# конфигурация по умолчанию в *этом* файле
5+
_defaults:
6+
autowire: true
7+
autoconfigure: true
8+
public: true
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
<?php
2+
return [
3+
Prokl\ServiceProvider\Tests\Fixtures\TestingBundle::class => ['all' => true],
4+
Prokl\ServiceProvider\Tests\Fixtures\TestingBundleDev::class => ['test' => true]
5+
];

src/ServiceProvider.php

Lines changed: 40 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,6 @@
3737
use Symfony\Component\Filesystem\Filesystem;
3838
use Symfony\Component\HttpKernel\Config\FileLocator;
3939
use Symfony\Component\HttpKernel\KernelEvents;
40-
use Symfony\Component\HttpKernel\KernelInterface;
4140
use Throwable;
4241

4342
/**
@@ -102,6 +101,21 @@ class ServiceProvider
102101
*/
103102
protected $configDir = '/local/configs';
104103

104+
/**
105+
* @var string $kernelServiceClass Класс, реализующий сервис kernel.
106+
*/
107+
protected $kernelServiceClass = AppKernel::class;
108+
109+
/**
110+
* @var array $standartCompilerPasses Пассы Symfony.
111+
*/
112+
protected $standartCompilerPasses = [];
113+
114+
/**
115+
* @var string $symfonyCompilerClass Класс с симфоническими compiler passes.
116+
*/
117+
protected $symfonyCompilerClass = SymfonyCompilerPassBag::class;
118+
105119
/**
106120
* @var ErrorScreen $errorHandler Обработчик ошибок.
107121
*/
@@ -152,16 +166,6 @@ class ServiceProvider
152166
*/
153167
private $debug;
154168

155-
/**
156-
* @var array $standartCompilerPasses Пассы Symfony.
157-
*/
158-
protected $standartCompilerPasses = [];
159-
160-
/**
161-
* @var string $symfonyCompilerClass Класс с симфоническими compiler passes.
162-
*/
163-
protected $symfonyCompilerClass = SymfonyCompilerPassBag::class;
164-
165169
/**
166170
* ServiceProvider constructor.
167171
*
@@ -639,11 +643,7 @@ private function initialize(string $fileName): ?ContainerBuilder
639643
private function setDefaultParamsContainer() : void
640644
{
641645
if (!static::$containerBuilder->hasDefinition('kernel')) {
642-
static::$containerBuilder->register('kernel', AppKernel::class)
643-
->addTag('service.bootstrap')
644-
->setAutoconfigured(true)
645-
->setPublic(true)
646-
->setArguments([$this->environment, $this->debug]);
646+
$this->registerKernel($this->kernelServiceClass);
647647
}
648648

649649
/** @var array $kernelParams */
@@ -652,6 +652,24 @@ private function setDefaultParamsContainer() : void
652652
static::$containerBuilder->getParameterBag()->add($kernelParams);
653653
}
654654

655+
/**
656+
* Регистрация kernel сервиса.
657+
*
658+
* @param string $kernelClass Класс Kernel.
659+
*
660+
* @return void
661+
*
662+
* @since 11.07.2021
663+
*/
664+
private function registerKernel(string $kernelClass) : void
665+
{
666+
static::$containerBuilder->register('kernel', $kernelClass)
667+
->addTag('service.bootstrap')
668+
->setAutoconfigured(true)
669+
->setPublic(true)
670+
->setArguments([$this->environment, $this->debug]);
671+
}
672+
655673
/**
656674
* Если надо создать директорию для компилированного контейнера.
657675
*
@@ -800,7 +818,7 @@ private function loadContainerConfig(string $fileName, ContainerBuilder $contain
800818
$loader = $this->getContainerLoader($containerBuilder);
801819

802820
try {
803-
$loader->load($_SERVER['DOCUMENT_ROOT'] . '/' . $fileName);
821+
$loader->load($this->projectRoot . '/' . $fileName);
804822
$loader->load(__DIR__ . '/../config/base.yaml');
805823
return true;
806824
} catch (Exception $e) {
@@ -824,7 +842,7 @@ private function loadContainerConfig(string $fileName, ContainerBuilder $contain
824842
*/
825843
private function configureContainer(ContainerBuilder $container, LoaderInterface $loader): void
826844
{
827-
$confDir = $_SERVER['DOCUMENT_ROOT'] . $this->configDir;
845+
$confDir = $this->projectRoot . $this->configDir;
828846

829847
if (!@file_exists($confDir)) {
830848
throw new RuntimeException(
@@ -834,8 +852,10 @@ private function configureContainer(ContainerBuilder $container, LoaderInterface
834852

835853
$container->setParameter('container.dumper.inline_class_loader', true);
836854

837-
$loader->load($confDir.'/packages/*'.self::CONFIG_EXTS, 'glob');
838-
855+
if (is_dir($confDir.'/packages')) {
856+
$loader->load($confDir.'/packages/*'.self::CONFIG_EXTS, 'glob');
857+
}
858+
839859
if (is_dir($confDir . '/packages/' . $this->environment)) {
840860
$loader->load($confDir . '/packages/' . $this->environment . '/**/*' . self::CONFIG_EXTS, 'glob');
841861
}

src/Services/AppKernel.php

Lines changed: 19 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -41,11 +41,16 @@ class AppKernel extends Kernel
4141
*/
4242
private $projectDir;
4343

44+
/**
45+
* @var ContainerInterface $kernelContainer Копия контейнера.
46+
*/
47+
protected static $kernelContainer;
48+
4449
/**
4550
* AppKernel constructor.
4651
*
4752
* @param string $environment Окружение.
48-
* @param boolean $debug Отладка.
53+
* @param boolean $debug Признак режима отладки.
4954
*/
5055
public function __construct(string $environment, bool $debug)
5156
{
@@ -163,7 +168,19 @@ public function getBundlesMetaData() : array
163168
*/
164169
public function setContainer(?ContainerInterface $container = null) : void
165170
{
166-
$this->container = $container;
171+
$this->container = static::$kernelContainer = $container;
172+
}
173+
174+
/**
175+
* {@inheritdoc}
176+
*/
177+
public function getContainer()
178+
{
179+
if (static::$kernelContainer === null) {
180+
throw new LogicException('Cannot retrieve the container from a non-booted kernel.');
181+
}
182+
183+
return static::$kernelContainer;
167184
}
168185

169186
/**

0 commit comments

Comments
 (0)