Passed
Pull Request — master (#9)
by Pavel
05:20
created

BankiruRpcServerExtension::load()   B

Complexity

Conditions 3
Paths 3

Size

Total Lines 32
Code Lines 18

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 21
CRAP Score 3

Importance

Changes 0
Metric Value
dl 0
loc 32
ccs 21
cts 21
cp 1
rs 8.8571
c 0
b 0
f 0
cc 3
eloc 18
nc 3
nop 2
crap 3
1
<?php
2
3
namespace Bankiru\Api\Rpc\DependencyInjection;
4
5
use Bankiru\Api\Rpc\Cache\RouterCacheWarmer;
6
use Bankiru\Api\Rpc\Listener\ExceptionListener;
7
use Bankiru\Api\Rpc\Listener\RouterListener;
8
use Bankiru\Api\Rpc\Routing\ResourceMethodCollectionLoader;
9
use Bankiru\Api\Rpc\Routing\Router;
10
use Bankiru\Api\Rpc\RpcEvents;
11
use Sensio\Bundle\FrameworkExtraBundle\SensioFrameworkExtraBundle;
12
use Symfony\Bundle\SecurityBundle\SecurityBundle;
13
use Symfony\Component\Config\FileLocator;
14
use Symfony\Component\DependencyInjection\ContainerBuilder;
15
use Symfony\Component\DependencyInjection\ContainerInterface;
16
use Symfony\Component\DependencyInjection\Definition;
17
use Symfony\Component\DependencyInjection\Extension\Extension;
18
use Symfony\Component\DependencyInjection\Loader\YamlFileLoader;
19
use Symfony\Component\DependencyInjection\Reference;
20
21
final class BankiruRpcServerExtension extends Extension
22
{
23
24
    /** {@inheritdoc} */
25 1
    public function load(array $configs, ContainerBuilder $container)
26
    {
27 1
        $loader = new YamlFileLoader($container, new FileLocator(__DIR__ . '/../Resources/config'));
28
29 1
        $bundles = $container->getParameter('kernel.bundles');
30
31 1
        $configuration = new Configuration();
32 1
        $config        = $this->processConfiguration($configuration, $configs);
33
34 1
        $loader->load('rpc.yml');
35
36 1
        if (in_array(SensioFrameworkExtraBundle::class, $bundles, true)) {
37 1
            $loader->load('sensio.yml');
38
39 1
            if (in_array(SecurityBundle::class, $bundles, true)) {
40 1
                $loader->load('security.yml');
41 1
            }
42 1
        }
43
44
        $container
45 1
            ->register('rpc_server.exception_listener', ExceptionListener::class)
46 1
            ->setArguments([$config['debug'], new Reference('logger', ContainerInterface::NULL_ON_INVALID_REFERENCE)])
47 1
            ->addTag(
48 1
                'kernel.event_listener',
49
                [
50 1
                    'event'  => RpcEvents::EXCEPTION,
51 1
                    'method' => 'onException',
52
                ]
53 1
            );
54
55 1
        $this->configureRouter($config['router'], $container);
56 1
    }
57
58 1
    public function getAlias()
59
    {
60 1
        return 'rpc_server';
61
    }
62
63
    /**
64
     * @param array            $router
65
     * @param ContainerBuilder $container
66
     */
67 1
    private function configureRouter(array $router, ContainerBuilder $container)
68
    {
69 1
        $endpoints        = $router['endpoints'];
70 1
        $endpointLoader   = $container->getDefinition('rpc_server.router.loader');
71 1
        $routerCollection = $container->getDefinition('rpc_server.router.collection');
72
73 1
        foreach ($endpoints as $name => $config) {
74 1
            $routerId = sprintf('rpc_server.endpoint_router.%s', $name);
75
76 1
            $container->register($routerId, Router::class)
77 1
                      ->setArguments(
78
                          [
79 1
                              new Definition(
80 1
                                  ResourceMethodCollectionLoader::class,
81
                                  [
82 1
                                      new Reference('rpc_server.router.resolver'),
83 1
                                      $config['resources'],
84 1
                                      $config['context'],
85
                                  ]
86 1
                              ),
87 1
                              $name,
88
                              [
89 1
                                  'cache_dir' => '%kernel.cache_dir%',
90 1
                              ],
91
                          ]
92 1
                      )
93 1
                      ->setPublic(false)
94 1
                      ->addTag('rpc_router');
95
96 1
            $container->register(sprintf('rpc_server.router_warmer.%s', $name), RouterCacheWarmer::class)
97 1
                      ->setPublic(false)
98 1
                      ->setArguments(
99
                          [
100 1
                              new Reference($routerId),
101
                          ]
102 1
                      )
103 1
                      ->addTag('kernel.cache_warmer');
104
105 1
            $container->register('rpc_server.router_listener.' . $name, RouterListener::class)
106 1
                      ->setArguments([$name, new Reference($routerId)])
107 1
                      ->addTag('kernel.event_listener', ['event' => 'rpc.request', 'method' => 'onRequest']);
108
109 1
            $endpointLoader->addMethodCall('addEndpoint', [$name, $config]);
110 1
            $routerCollection->addMethodCall('addRouter', [$name, new Reference($routerId)]);
111 1
        }
112 1
    }
113
}
114