Passed
Pull Request — master (#9)
by Pavel
06:14
created

BankiruRpcServerExtension   A

Complexity

Total Complexity 6

Size/Duplication

Total Lines 93
Duplicated Lines 0 %

Coupling/Cohesion

Components 0
Dependencies 7

Test Coverage

Coverage 100%

Importance

Changes 0
Metric Value
wmc 6
lcom 0
cbo 7
dl 0
loc 93
ccs 56
cts 56
cp 1
rs 10
c 0
b 0
f 0

3 Methods

Rating   Name   Duplication   Size   Complexity  
B load() 0 32 3
A getAlias() 0 4 1
B configureRouter() 0 46 2
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\Definition;
16
use Symfony\Component\DependencyInjection\Extension\Extension;
17
use Symfony\Component\DependencyInjection\Loader\YamlFileLoader;
18
use Symfony\Component\DependencyInjection\Reference;
19
20
final class BankiruRpcServerExtension extends Extension
21
{
22
23
    /** {@inheritdoc} */
24 1
    public function load(array $configs, ContainerBuilder $container)
25
    {
26 1
        $loader = new YamlFileLoader($container, new FileLocator(__DIR__ . '/../Resources/config'));
27
28 1
        $bundles = $container->getParameter('kernel.bundles');
29
30 1
        $configuration = new Configuration();
31 1
        $config        = $this->processConfiguration($configuration, $configs);
32
33 1
        $loader->load('rpc.yml');
34
35 1
        if (in_array(SensioFrameworkExtraBundle::class, $bundles, true)) {
36 1
            $loader->load('sensio.yml');
37
38 1
            if (in_array(SecurityBundle::class, $bundles, true)) {
39 1
                $loader->load('security.yml');
40 1
            }
41 1
        }
42
43
        $container
44 1
            ->register('rpc_server.exception_listener', ExceptionListener::class)
45 1
            ->setArguments([$config['debug'], new Reference('logger')])
46 1
            ->addTag(
47 1
                'kernel.event_listener',
48
                [
49 1
                    'event'  => RpcEvents::EXCEPTION,
50 1
                    'method' => 'onException',
51
                ]
52 1
            );
53
54 1
        $this->configureRouter($config['router'], $container);
55 1
    }
56
57 1
    public function getAlias()
58
    {
59 1
        return 'rpc_server';
60
    }
61
62
    /**
63
     * @param array            $router
64
     * @param ContainerBuilder $container
65
     */
66 1
    private function configureRouter(array $router, ContainerBuilder $container)
67
    {
68 1
        $endpoints        = $router['endpoints'];
69 1
        $endpointLoader   = $container->getDefinition('rpc_server.router.loader');
70 1
        $routerCollection = $container->getDefinition('rpc_server.router.collection');
71
72 1
        foreach ($endpoints as $name => $config) {
73 1
            $routerId = sprintf('rpc_server.endpoint_router.%s', $name);
74
75 1
            $container->register($routerId, Router::class)
76 1
                      ->setArguments(
77
                          [
78 1
                              new Definition(
79 1
                                  ResourceMethodCollectionLoader::class,
80
                                  [
81 1
                                      new Reference('rpc_server.router.resolver'),
82 1
                                      $config['resources'],
83 1
                                      $config['context'],
84
                                  ]
85 1
                              ),
86 1
                              $name,
87
                              [
88 1
                                  'cache_dir' => '%kernel.cache_dir%',
89 1
                              ],
90
                          ]
91 1
                      )
92 1
                      ->setPublic(false)
93 1
                      ->addTag('rpc_router');
94
95 1
            $container->register(sprintf('rpc_server.router_warmer.%s', $name), RouterCacheWarmer::class)
96 1
                      ->setPublic(false)
97 1
                      ->setArguments(
98
                          [
99 1
                              new Reference($routerId),
100
                          ]
101 1
                      )
102 1
                      ->addTag('kernel.cache_warmer');
103
104 1
            $container->register('rpc_server.router_listener.' . $name, RouterListener::class)
105 1
                      ->setArguments([$name, new Reference($routerId)])
106 1
                      ->addTag('kernel.event_listener', ['event' => 'rpc.request', 'method' => 'onRequest']);
107
108 1
            $endpointLoader->addMethodCall('addEndpoint', [$name, $config]);
109 1
            $routerCollection->addMethodCall('addRouter', [$name, new Reference($routerId)]);
110 1
        }
111 1
    }
112
}
113