/
ExtensionWithPlugins.php
102 lines (86 loc) · 2.88 KB
/
ExtensionWithPlugins.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
<?php
namespace Matthias\BundlePlugins;
use Symfony\Component\DependencyInjection\ContainerBuilder;
use Symfony\Component\DependencyInjection\Extension\PrependExtensionInterface;
use Symfony\Component\HttpKernel\DependencyInjection\Extension;
final class ExtensionWithPlugins extends Extension implements PrependExtensionInterface
{
/**
* @var string
*/
private $alias;
/**
* @var BundlePlugin[]
*/
private $registeredPlugins;
/**
* @param string $alias The alias for this extension (i.e. the configuration key)
* @param array $registeredPlugins The plugins that were registered
*/
public function __construct($alias, array $registeredPlugins)
{
$this->registeredPlugins = $registeredPlugins;
$this->alias = $alias;
}
/**
* @inheritdoc
*/
public function load(array $config, ContainerBuilder $container)
{
$configuration = $this->getConfiguration($config, $container);
$processedConfiguration = $this->processConfiguration($configuration, $config);
foreach ($this->registeredPlugins as $plugin) {
$this->loadPlugin($container, $plugin, $processedConfiguration);
}
}
/**
* @inheritdoc
*/
public function getConfiguration(array $config, ContainerBuilder $container)
{
return new ConfigurationWithPlugins($this->getAlias(), $this->registeredPlugins);
}
/**
* @inheritdoc
*/
public function getAlias()
{
return $this->alias;
}
/**
* @param ContainerBuilder $container
* @param BundlePlugin $plugin
* @param array $processedConfiguration The fully processed configuration values for this bundle
*/
private function loadPlugin(ContainerBuilder $container, BundlePlugin $plugin, array $processedConfiguration)
{
$container->addClassResource(new \ReflectionClass(get_class($plugin)));
$pluginConfiguration = $this->pluginConfiguration($plugin, $processedConfiguration);
$plugin->load($pluginConfiguration, $container);
}
/**
* Get just the part of the configuration values that applies to the given plugin.
*
* @param BundlePlugin $plugin
* @param array $processedConfiguration The fully processed configuration values for this bundle
* @return array
*/
private function pluginConfiguration(BundlePlugin $plugin, array $processedConfiguration)
{
if (!isset($processedConfiguration[$plugin->name()])) {
return array();
}
return $processedConfiguration[$plugin->name()];
}
/**
* Allow an extension to prepend the extension configurations.
*
* @param ContainerBuilder $container
*/
public function prepend(ContainerBuilder $container)
{
foreach ($this->registeredPlugins as $plugin) {
$plugin->prepend($container);
}
}
}