Skip to content

Commit fa11812

Browse files
authored
Merge pull request #6 from Micro-PHP/kernel-load-plugin
v1.3: implements KernelInterface::loadPlugin method in runtime
2 parents b3911f5 + bb5a252 commit fa11812

File tree

6 files changed

+107
-52
lines changed

6 files changed

+107
-52
lines changed

README.md

Lines changed: 16 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -28,32 +28,39 @@ include 'vendor/autoload.php';
2828

2929
```php
3030

31+
use Micro\Framework\Kernel\Configuration\DefaultApplicationConfiguration;
32+
use Micro\Framework\Kernel\Plugin\PluginDependedInterface;
33+
use Micro\Framework\Kernel\Plugin\ApplicationPluginInterface;
34+
use Micro\Component\DependencyInjection\Container;
35+
use Micro\Framework\Kernel\Plugin\PluginBootLoaderInterface;
36+
use Micro\Framework\Kernel\KernelBuilder;
37+
3138
// Create simple plugin
32-
class TestPlugin extends \Micro\Framework\Kernel\Plugin\AbstractPlugin
39+
class TestPlugin implements PluginDependedInterface
3340
{
34-
public function provideDependencies(\Micro\Component\DependencyInjection\Container $container): void
41+
public function provideDependencies(Container $container): void
3542
{
3643
print_r('Provided dependencies');
3744
}
3845
}
3946

4047
// Create Dependency provider boot loader
41-
class DependencyProviderLoader implements \Micro\Framework\Kernel\Plugin\PluginBootLoaderInterface
48+
class DependencyProviderLoader implements PluginBootLoaderInterface
4249
{
4350

44-
public function __construct(private readonly \Micro\Component\DependencyInjection\Container $container)
51+
public function __construct(private readonly Container $container)
4552
{
4653
}
4754

48-
public function boot(\Micro\Framework\Kernel\Plugin\ApplicationPluginInterface $applicationPlugin): void
55+
public function boot(ApplicationPluginInterface $applicationPlugin): void
4956
{
50-
$applicationPlugin->provideDependencies($this->container);
57+
$applicationPlugin->getDependedPlugins($this->container);
5158
}
5259
}
5360

54-
$kernelBuilder = new \Micro\Framework\Kernel\KernelBuilder();
55-
$container = new \Micro\Component\DependencyInjection\Container();
56-
$configuration = new \Micro\Framework\Kernel\Configuration\DefaultApplicationConfiguration(['APP_ENV' => 'dev']);
61+
$kernelBuilder = new KernelBuilder();
62+
$container = new Container();
63+
$configuration = new DefaultApplicationConfiguration(['APP_ENV' => 'dev']);
5764
$kernel = $kernelBuilder
5865
->setApplicationConfiguration($configuration)
5966
->setContainer($container)

composer.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
"name": "micro/kernel",
33
"type": "library",
44
"description": "",
5-
"version": "1.2",
5+
"version": "1.3",
66
"license": "MIT",
77
"autoload": {
88
"psr-4": {
@@ -16,7 +16,7 @@
1616
}
1717
],
1818
"require": {
19-
"php": ">=8.0",
19+
"php": "^8.1|^8.2",
2020
"micro/dependency-injection": "^1"
2121
}
2222
}

phpdoc.xml

Lines changed: 0 additions & 33 deletions
This file was deleted.

src/Kernel.php

Lines changed: 16 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,11 @@ class Kernel implements KernelInterface
2222
*/
2323
private array $plugins;
2424

25+
/**
26+
* @var string[]
27+
*/
28+
private array $pluginsLoaded;
29+
2530
/**
2631
* @param array $applicationPluginCollection
2732
* @param Container|null $container
@@ -36,11 +41,12 @@ public function __construct(
3641
$this->isStarted = false;
3742
$this->isTerminated = false;
3843

44+
$this->pluginsLoaded = [];
3945
$this->plugins = [];
4046
}
4147

4248
/**
43-
* @return void
49+
* {@inheritDoc}
4450
*/
4551
public function run(): void
4652
{
@@ -53,7 +59,7 @@ public function run(): void
5359
}
5460

5561
/**
56-
* @return void
62+
* {@inheritDoc}
5763
*/
5864
public function terminate(): void
5965
{
@@ -65,26 +71,30 @@ public function terminate(): void
6571
}
6672

6773
/**
68-
* @return Container
74+
* {@inheritDoc}
6975
*/
7076
public function container(): Container
7177
{
7278
return $this->container;
7379
}
7480

7581
/**
76-
* @param string $applicationPluginClass
77-
* @return void
82+
* {@inheritDoc}
7883
*/
79-
protected function loadPlugin(string $applicationPluginClass): void
84+
public function loadPlugin(string $applicationPluginClass): void
8085
{
86+
if (in_array($applicationPluginClass, $this->pluginsLoaded, true)) {
87+
return;
88+
}
89+
8190
$plugin = new $applicationPluginClass();
8291

8392
foreach ($this->pluginBootLoaderCollection as $bootLoader) {
8493
$bootLoader->boot($plugin);
8594
}
8695

8796
$this->plugins[] = $plugin;
97+
$this->pluginsLoaded[] = $applicationPluginClass;
8898
}
8999

90100
/**

src/KernelInterface.php

Lines changed: 58 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,33 +4,89 @@
44

55
use Micro\Component\DependencyInjection\Container;
66

7+
/**
8+
* The kernel is needed for plugin management. A plugin can be any class object.
9+
*
10+
* <a href="https://github.com/Micro-PHP/micro-kernel/blob/master/src/Kernel.php" target="_blank"> Kernel implementation </a>
11+
*
12+
* <a href="https://github.com/Micro-PHP/micro-kernel" target="_blank"> GitHub Docs </a>
13+
*
14+
* <a href="https://packagist.org/packages/micro/kernel" target="_blank"> Packagist Repo </a>
15+
*
16+
* ```php
17+
* interface SomePluginInterface
18+
* {
19+
* public function getName(): string;
20+
* }
21+
*
22+
* $kernel = new Kernel(
23+
* [
24+
* new class implements SomePluginInterface
25+
* {
26+
* public function getName(): string
27+
* {
28+
* return 'SomePluginName';
29+
* }
30+
* }
31+
* ],
32+
* []
33+
* );
34+
*
35+
* $kernel->run();
36+
* $iterator = $kernel->plugins(SomePluginInterface::class);
37+
* foreach($iterator as $plugin)
38+
* {
39+
* print_r($plugin->getName() . "\r\n");
40+
* }
41+
*
42+
* ```
43+
*
44+
* @api
45+
*/
746
interface KernelInterface
847
{
948
/**
1049
* Get service Dependency Injection Container
1150
*
51+
* @api
52+
*
1253
* @return Container
1354
*/
1455
public function container(): Container;
1556

1657
/**
1758
* Run application
1859
*
60+
* @api
61+
*
1962
* @return void
2063
*/
2164
public function run(): void;
2265

2366
/**
2467
* Terminate application
2568
*
69+
* @api
70+
*
2671
* @return void
2772
*/
2873
public function terminate(): void;
2974

3075
/**
31-
* @param string|null $interfaceInherited
76+
* @param string $applicationPluginClass
77+
*
78+
* @return void
79+
*/
80+
public function loadPlugin(string $applicationPluginClass): void;
81+
82+
/**
83+
* Iterate plugins with the specified type.
84+
*
85+
* @param string|null $interfaceInherited If empty, each connected plugin will be iterated.
86+
*
87+
* @api
3288
*
33-
* @return iterable<object>
89+
* @return iterable<object> Application plugins iterator
3490
*/
3591
public function plugins(string $interfaceInherited = null): iterable;
3692
}

src/Plugin/PluginBootLoaderInterface.php

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,24 @@
22

33
namespace Micro\Framework\Kernel\Plugin;
44

5+
/**
6+
* An interface that allows you to declare plugin loading behavior. Called when the plugin is initialized.
7+
*
8+
* Do not use this interface unless absolutely necessary.
9+
*
10+
* <a href="https://github.com/Micro-PHP/kernel-bootloader-configuration/blob/master/src/Boot/ConfigurationProviderBootLoader.php">
11+
* An example of the implementation of the loader to create an object with the plugin configuration.
12+
* </a>
13+
*
14+
* @api
15+
*/
516
interface PluginBootLoaderInterface
617
{
718
/**
19+
* Immediately after creation, a pre-configuration plugin gets here.
20+
*
21+
* @api
22+
*
823
* @param object $applicationPlugin
924
*
1025
* @return void

0 commit comments

Comments
 (0)