Passed
Pull Request — master (#35)
by Christian
02:12
created

Application::__construct()   B

Complexity

Conditions 2
Paths 2

Size

Total Lines 24
Code Lines 15

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 2
eloc 15
nc 2
nop 2
dl 0
loc 24
rs 8.9713
c 0
b 0
f 0
1
<?php declare(strict_types=1);
2
3
namespace Cocotte;
4
5
use Cocotte\DependencyInjection\ConsoleCommandPass;
6
use Cocotte\DependencyInjection\LazyEnvironmentPass;
7
use Cocotte\DependencyInjection\OptionProviderPass;
8
use Symfony\Bridge\ProxyManager\LazyProxy\Instantiator\RuntimeInstantiator;
9
use Symfony\Component\Config\FileLocator;
10
use Symfony\Component\Console\Application as Console;
11
use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface;
12
use Symfony\Component\DependencyInjection\ContainerBuilder;
13
use Symfony\Component\DependencyInjection\ContainerInterface;
14
use Symfony\Component\DependencyInjection\Loader\YamlFileLoader;
15
use Symfony\Component\EventDispatcher\DependencyInjection\RegisterListenersPass;
16
use Symfony\Component\EventDispatcher\EventDispatcherInterface;
17
18
final class Application
19
{
20
    /**
21
     * @var ContainerInterface
22
     */
23
    private $container;
24
25
    /**
26
     * @param string $serviceResource
27
     * @param CompilerPassInterface[] $extraPasses
28
     * @throws \Exception
29
     */
30
    public function __construct(string $serviceResource, array $extraPasses = [])
31
    {
32
        $container = new ContainerBuilder();
33
        $container->setProxyInstantiator(new RuntimeInstantiator());
34
35
        $loader = new YamlFileLoader($container, new FileLocator());
36
        $loader->load($serviceResource);
37
38
        $container->addCompilerPass(new LazyEnvironmentPass());
39
        $container->addCompilerPass(new ConsoleCommandPass());
40
        $container->addCompilerPass(new OptionProviderPass());
41
        $container->addCompilerPass(new RegisterListenersPass(
42
            EventDispatcherInterface::class,
43
            'event.listener',
44
            'event.subscriber'
45
        ));
46
47
        foreach ($extraPasses as $pass) {
48
            $container->addCompilerPass($pass);
49
        }
50
51
        $container->compile(true);
52
53
        $this->container = $container;
54
    }
55
56
    public function container(): ContainerInterface
57
    {
58
        return $this->container;
59
    }
60
61
    public function console(): Console
62
    {
63
        return $this->container->get(Console::class);
64
    }
65
}