This repository was archived by the owner on Aug 22, 2023. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 43
Expand file tree
/
Copy pathFlagceptionExtension.php
More file actions
97 lines (82 loc) · 3.46 KB
/
FlagceptionExtension.php
File metadata and controls
97 lines (82 loc) · 3.46 KB
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
<?php
namespace Flagception\Bundle\FlagceptionBundle\DependencyInjection;
use Exception;
use Flagception\Activator\FeatureActivatorInterface;
use Flagception\Bundle\FlagceptionBundle\Activator\TraceableChainActivator;
use Flagception\Bundle\FlagceptionBundle\DependencyInjection\Configurator\ActivatorConfiguratorInterface;
use Flagception\Decorator\ContextDecoratorInterface;
use Symfony\Component\DependencyInjection\ContainerBuilder;
use Symfony\Component\Config\FileLocator;
use Symfony\Component\HttpKernel\DependencyInjection\Extension;
use Symfony\Component\DependencyInjection\Loader;
/**
* Class FlagceptionExtension
*
* @author Michel Chowanski <michel.chowanski@bestit-online.de>
* @package Flagception\Bundle\FlagceptionBundle\DependencyInjection
*/
class FlagceptionExtension extends Extension
{
/**
* {@inheritdoc}
*/
public function load(array $configs, ContainerBuilder $container)
{
$loader = new Loader\YamlFileLoader($container, new FileLocator(__DIR__ . '/../Resources/config'));
$loader->load('configurators.yml');
$loader->load('services.yml');
$configurators = $this->getConfigurators($container);
$configuration = new Configuration($configurators);
$config = $this->processConfiguration($configuration, $configs);
// Enable / disable annotation subscriber
if ($config['annotation']['enable'] === false) {
$container->removeDefinition('flagception.listener.annotation_subscriber');
}
// Enable / disable routing metadata subscriber
if ($config['routing_metadata']['enable'] === false) {
$container->removeDefinition('flagception.listener.routing_metadata_subscriber');
}
// Enable / disable activators
foreach ($configurators as $name => $configurator) {
if (!array_key_exists($name, $config['activators'])) {
continue;
}
$configurator->addActivator($container, $config['activators'][$name], $config['features']);
}
if ($container->hasParameter('kernel.debug') && $container->getParameter('kernel.debug')) {
$chainDefinition = $container->getDefinition('flagception.activator.chain_activator');
$chainDefinition->setClass(TraceableChainActivator::class);
}
if (method_exists($container, 'registerForAutoconfiguration') === true) {
$container
->registerForAutoconfiguration(FeatureActivatorInterface::class)
->addTag('flagception.activator');
$container
->registerForAutoconfiguration(ContextDecoratorInterface::class)
->addTag('flagception.context_decorator');
}
}
public function getConfiguration(array $config, ContainerBuilder $container)
{
return new Configuration($this->getConfigurators($container));
}
/**
* Get configurators
*
* @param ContainerBuilder $container
*
* @return ActivatorConfiguratorInterface[]
*
* @throws Exception
*/
private function getConfigurators(ContainerBuilder $container): array
{
$configurators = [];
$services = $container->findTaggedServiceIds('flagception.configurator');
foreach (array_keys($services) as $id) {
$configurator = $container->get($id);
$configurators[str_replace('-', '_', $configurator->getKey())] = $configurator;
}
return $configurators;
}
}