Skip to content

Commit 2295efb

Browse files
committed
Implements KernelInterface
1 parent e37e6f9 commit 2295efb

File tree

8 files changed

+215
-27
lines changed

8 files changed

+215
-27
lines changed

.gitignore

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

src/Configuration/Resolver/PluginConfigurationClassResolver.php

Lines changed: 16 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
<?php
22

3-
namespace Micro\Framework\Kernel\Configuration;
3+
namespace Micro\Framework\Kernel\Configuration\Resolver;
44

5-
use Micro\Framework\Kernel\Configuration\Resolver\PluginConfigurationClassResolverInterface;
6-
use Micro\Framework\Kernel\Configuration\Resolver\PluginNameResolver;
7-
use Micro\Framework\Kernel\Configuration\Resolver\PluginNameShortResolver;
5+
6+
use Micro\Framework\Kernel\Configuration\ApplicationConfigurationInterface;
7+
use Micro\Framework\Kernel\Configuration\PluginConfiguration;
88

99
class PluginConfigurationClassResolver
1010
{
@@ -21,8 +21,7 @@ public function __construct(
2121
private string $pluginClass,
2222
private ApplicationConfigurationInterface $applicationConfiguration
2323
) {
24-
$this->resolvers[] = new PluginNameResolver();
25-
$this->resolvers[] = new PluginNameShortResolver();
24+
$this->resolvers = $this->getPluginClassResolvers();
2625
}
2726

2827
/**
@@ -57,4 +56,15 @@ public function resolve(): PluginConfiguration
5756

5857
return new $configClass($this->applicationConfiguration);
5958
}
59+
60+
/**
61+
* @return PluginConfigurationClassResolver[]
62+
*/
63+
protected function getPluginClassResolvers(): array
64+
{
65+
return [
66+
new PluginNameResolver(),
67+
new PluginNameShortResolver(),
68+
];
69+
}
6070
}
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
<?php
2+
3+
namespace Micro\Framework\Kernel\Container;
4+
5+
use Micro\Component\DependencyInjection\Container;
6+
7+
interface ApplicationContainerFactoryInterface
8+
{
9+
/**
10+
* @return Container
11+
*/
12+
public function create(): Container;
13+
}
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
<?php
2+
3+
namespace Micro\Framework\Kernel\Container\Impl;
4+
5+
use Micro\Component\DependencyInjection\Container;
6+
use Micro\Framework\Kernel\Container\ApplicationContainerFactoryInterface;
7+
8+
class ApplicationContainerFactory implements ApplicationContainerFactoryInterface
9+
{
10+
/**
11+
* {@inheritDoc}
12+
*/
13+
public function create(): Container
14+
{
15+
return new Container();
16+
}
17+
}

src/Kernel.php

Lines changed: 46 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -7,44 +7,64 @@
77
use Micro\Component\DependencyInjection\Container;
88
use Micro\Framework\Kernel\Configuration\ApplicationConfigurationInterface;
99
use Micro\Framework\Kernel\Configuration\PluginConfiguration;
10-
use Micro\Framework\Kernel\Configuration\PluginConfigurationClassResolver;
10+
use Micro\Framework\Kernel\Configuration\Resolver\PluginConfigurationClassResolver;
1111
use Micro\Framework\Kernel\Plugin\ApplicationPluginInterface;
1212

13-
class Kernel
13+
class Kernel implements KernelInterface
1414
{
15+
/**
16+
* @var bool
17+
*/
18+
private bool $isStarted;
19+
20+
/**
21+
* @var bool
22+
*/
23+
private bool $isTerminated;
24+
1525
/**
1626
* @param string[] $applicationPluginCollection
1727
*/
1828
public function __construct(
19-
private array $applicationPluginCollection,
20-
private ApplicationConfigurationInterface $configuration,
21-
private ?Container $container = null
29+
private array $applicationPluginCollection,
30+
private ApplicationConfigurationInterface $configuration,
31+
private ?Container $container = null
2232
) {
33+
$this->isStarted = false;
34+
$this->isTerminated = false;
2335
}
2436

2537
/**
2638
* @return void
2739
*/
2840
public function run(): void
2941
{
42+
if($this->isStarted) {
43+
return;
44+
}
45+
3046
$this->bootPlugins();
47+
$this->isStarted = true;
3148
}
3249

3350
/**
3451
* @return void
3552
*/
3653
public function terminate(): void
3754
{
55+
if(!$this->isStarted || $this->isTerminated) {
56+
return;
57+
}
58+
59+
$this->isTerminated = true;
3860
}
3961

4062
/**
41-
* @return void
63+
* @return Container
4264
*/
43-
private function bootPlugins(): void
65+
public function container(): Container
4466
{
45-
foreach ($this->applicationPluginCollection as $applicationPlugin) {
46-
$this->bootPlugin($applicationPlugin);
47-
}
67+
return $this->container;
4868
}
4969

5070
/**
@@ -60,7 +80,16 @@ protected function bootPlugin(string $applicationPluginClass): void
6080
/*** @var ApplicationPluginInterface $plugin */
6181
$plugin = new $applicationPluginClass($pluginConfiguration);
6282

63-
$plugin->provideDependencies($this->getContainer());
83+
$plugin->provideDependencies($this->container());
84+
}
85+
86+
/**
87+
* @param string $applicationPluginClass
88+
* @return PluginConfigurationClassResolver
89+
*/
90+
protected function createPluginConfigurationResolver(string $applicationPluginClass): PluginConfigurationClassResolver
91+
{
92+
return new PluginConfigurationClassResolver($applicationPluginClass, $this->configuration);
6493
}
6594

6695
/**
@@ -70,22 +99,18 @@ protected function bootPlugin(string $applicationPluginClass): void
7099
* @param string $applicationPluginClass
71100
* @return void
72101
*/
73-
private function resolvePluginConfiguration(string $applicationPluginClass): PluginConfiguration
102+
protected function resolvePluginConfiguration(string $applicationPluginClass): PluginConfiguration
74103
{
75-
$resolver = new PluginConfigurationClassResolver($applicationPluginClass, $this->configuration);
76-
77-
return $resolver->resolve();
104+
return $this->createPluginConfigurationResolver($applicationPluginClass)->resolve();
78105
}
79106

80107
/**
81-
* @return Container
108+
* @return void
82109
*/
83-
private function getContainer(): Container
110+
protected function bootPlugins(): void
84111
{
85-
if(!$this->container) {
86-
$this->container = new Container();
112+
foreach ($this->applicationPluginCollection as $applicationPlugin) {
113+
$this->bootPlugin($applicationPlugin);
87114
}
88-
89-
return $this->container;
90115
}
91116
}

src/KernelBuilder.php

Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,77 @@
1+
<?php
2+
3+
namespace Micro\Framework\Kernel;
4+
5+
use Micro\Component\DependencyInjection\Container;
6+
use Micro\Framework\Kernel\Configuration\ApplicationConfigurationInterface;
7+
use Micro\Framework\Kernel\Container\ApplicationContainerFactoryInterface;
8+
use Micro\Framework\Kernel\Container\Impl\ApplicationContainerFactory;
9+
use Micro\Framework\Kernel\Plugin\ApplicationPluginInterface;
10+
11+
class KernelBuilder
12+
{
13+
/**
14+
* @var ApplicationPluginInterface[]
15+
*/
16+
private array $pluginCollection;
17+
18+
/**
19+
* @var ApplicationConfigurationInterface
20+
*/
21+
private ApplicationConfigurationInterface $configuration;
22+
23+
public function __construct()
24+
{
25+
$this->pluginCollection = [];
26+
}
27+
28+
/**
29+
* @param array $applicationPluginCollection
30+
* @return $this
31+
*/
32+
public function setApplicationPlugins(array $applicationPluginCollection): self
33+
{
34+
$this->pluginCollection = $applicationPluginCollection;
35+
36+
return $this;
37+
}
38+
39+
/**
40+
* @param ApplicationConfigurationInterface $configuration
41+
* @return $this
42+
*/
43+
public function setApplicationConfiguration(ApplicationConfigurationInterface $configuration)
44+
{
45+
$this->configuration = $configuration;
46+
47+
return $this;
48+
}
49+
50+
/**
51+
* @return ApplicationContainerFactoryInterface
52+
*/
53+
protected function createApplicationContainerFactory(): ApplicationContainerFactoryInterface
54+
{
55+
return new ApplicationContainerFactory();
56+
}
57+
58+
/**
59+
* @return Container
60+
*/
61+
protected function container(): Container
62+
{
63+
return $this->createApplicationContainerFactory()->create();
64+
}
65+
66+
/**
67+
* @return Kernel
68+
*/
69+
public function build(): Kernel
70+
{
71+
return new Kernel(
72+
$this->pluginCollection,
73+
$this->configuration,
74+
$this->container()
75+
);
76+
}
77+
}

src/KernelInterface.php

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
<?php
2+
3+
namespace Micro\Framework\Kernel;
4+
5+
use Micro\Component\DependencyInjection\Container;
6+
7+
interface KernelInterface
8+
{
9+
/**
10+
* Get service Dependency Injection Container
11+
*
12+
* @return Container
13+
*/
14+
public function container(): Container;
15+
16+
/**
17+
* Run application
18+
*
19+
* @return void
20+
*/
21+
public function run(): void;
22+
23+
/**
24+
* Terminate application
25+
*
26+
* @return void
27+
*/
28+
public function terminate(): void;
29+
30+
31+
}
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
<?php
2+
3+
namespace Micro\Framework\Kernel\Plugin;
4+
5+
interface PluginBootLoaderInterface
6+
{
7+
/**
8+
* @param ApplicationPluginInterface $applicationPlugin
9+
* @return void
10+
*/
11+
public function boot(ApplicationPluginInterface $applicationPlugin): void;
12+
}

0 commit comments

Comments
 (0)