Completed
Push — master ( be772b...99d542 )
by Tomas
16:16
created

EziatPermissionExtension::load()   B

Complexity

Conditions 5
Paths 4

Size

Total Lines 21
Code Lines 12

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
dl 0
loc 21
rs 8.7624
c 0
b 0
f 0
cc 5
eloc 12
nc 4
nop 2
1
<?php
2
3
declare(strict_types = 1);
4
5
namespace Eziat\PermissionBundle\DependencyInjection;
6
7
use Eziat\PermissionBundle\Manager\Doctrine\PermissionManager;
8
use Symfony\Component\Config\Definition\Processor;
9
use Symfony\Component\Config\FileLocator;
10
use Symfony\Component\DependencyInjection\Alias;
11
use Symfony\Component\DependencyInjection\ContainerBuilder;
12
use Symfony\Component\DependencyInjection\Extension\Extension;
13
use Symfony\Component\DependencyInjection\Loader;
14
use Symfony\Component\DependencyInjection\Reference;
15
16
/**
17
 * @author Tomas Jakl <[email protected]>
18
 */
19
class EziatPermissionExtension extends Extension
20
{
21
    /**
22
     * {@inheritdoc}
23
     */
24
    public function load(array $configs, ContainerBuilder $container)
25
    {
26
        $processor     = new Processor();
27
        $configuration = new Configuration();
28
        $loader        = new Loader\XmlFileLoader($container, new FileLocator(__DIR__.'/../Resources/config'));
29
30
        $config = $processor->processConfiguration($configuration, $configs);
31
32
        if (array_key_exists('database', $config) && $config['database'] !== null) {
33
            $this->loadDoctrine($config['database'], $container, $loader);
34
        }
35
36
        if (array_key_exists('cache', $config) && $config['cache'] !== null) {
37
            $this->loadCachedUserManager($config['cache'], $container, $loader);
38
        } else {
39
            $this->loadBasicUserManager($container, $loader);
40
        }
41
42
        // Set permissions array.
43
        $container->setParameter('eziat_permission.permissions', $config['permissions']);
44
    }
45
46
    private function loadBasicUserManager(ContainerBuilder $container, Loader\XmlFileLoader $loader)
47
    {
48
        $loader->load('user_manager.xml');
49
        $container->setAlias('Eziat\PermissionBundle\Model\UserManagerInterface',
50
            new Alias('eziat_permission.manager.user', false));
51
    }
52
53
    private function loadCachedUserManager(array $config, ContainerBuilder $container, Loader\XmlFileLoader $loader)
54
    {
55
        // Sets a correct cache adapter.
56
        $container->setAlias('eziat_permission.cache_adapter', new Alias('cache.app', false));
57
        // Sets a cache prefix.
58
        $container->setParameter('eziat_permission.cache.prefix', $config['cache_prefix']);
59
        // Sets cache expire parameter.
60
        $container->setParameter('eziat_permission.cache.expire_at', $config['expires_at']);
61
62
        $loader->load('cached_user_manager.xml');
63
        $container->setAlias('Eziat\PermissionBundle\Model\UserManagerInterface',
64
            new Alias('eziat_permission.manager.cached_user', false));
65
    }
66
67
    private function loadDoctrine(array $config, ContainerBuilder $container, Loader\XmlFileLoader $loader)
68
    {
69
        // Sets permission class parameter.
70
        $container->setParameter('eziat_permission.model.permission_class', $config['permission_class']);
71
72
        // Sets object manager name.
73
        if ($config['object_manager_name'] === null) {
74
            $container->setParameter('eziat_permission.model.manager_name', 'default');
75
        } else {
76
            $container->setParameter('eziat_permission.model.manager_name', $config['object_manager_name']);
77
        }
78
79
        // Sets permission manager if does not exist.
80
        if ($config['permission_manager_class'] === null) {
81
            $container->setParameter('eziat_permission.permission_manager_class', PermissionManager::class);
82
            $config['permission_manager_class'] = PermissionManager::class;
83
        } else {
84
            $container->setParameter('eziat_permission.permission_manager_class', $config['permission_manager_class']);
85
        }
86
87
        // Configure doctrine manager.
88
        $loader->load('doctrine.xml');
89
        $container->setAlias('eziat_permission.doctrine_registry', new Alias('doctrine', false));
90
        $definition = $container->getDefinition('eziat_permission.object_manager');
91
        $definition->setFactory([new Reference('eziat_permission.doctrine_registry'), 'getManager']);
92
93
        // Set a PermissionManagerInterface alias.
94
        $container->setAlias('eziat_permission.permission_manager',
95
            new Alias($config['permission_manager_class'], false));
96
        $container->setAlias('Eziat\PermissionBundle\Model\PermissionManagerInterface',
97
            new Alias('eziat_permission.permission_manager', false));
98
99
        // Set a loader permission.
100
        $loader->load('loader.xml');
101
        $container->setAlias('Eziat\PermissionBundle\Loader\PermissionLoaderInterface',
102
            new Alias('eziat_permission.loader.permission', false));
103
    }
104
}