Failed Conditions
Pull Request — release/0.2.0 (#35)
by Yo
05:02
created

KernelFactory::cleanKernelBridgeFile()   A

Complexity

Conditions 3
Paths 3

Size

Total Lines 18
Code Lines 11

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 0
CRAP Score 12

Importance

Changes 0
Metric Value
dl 0
loc 18
ccs 0
cts 17
cp 0
rs 9.4285
c 0
b 0
f 0
cc 3
eloc 11
nc 3
nop 1
crap 12
1
<?php
2
namespace Yoanm\Behat3SymfonyExtension\Factory;
3
4
use Psr\Log\LoggerInterface;
5
use Symfony\Component\HttpKernel\KernelInterface;
6
use Yoanm\Behat3SymfonyExtension\Dispatcher\BehatKernelEventDispatcher;
7
8
class KernelFactory
9
{
10
    const KERNEL_BRIDGE_CLASS_NAME = 'YoanmBehat3SymfonyKernelBridge';
11
    const KERNEL_BRIDGE_TEMPLATE_COMMENT = <<<COMMENT
12
13
/******** WARNING : THIS FILE IS JUST A TEMPLATE, IT IS NOT LOADABLE AS IS ********/
14
COMMENT;
15
16
    /** @var BehatKernelEventDispatcher */
17
    private $behatKernelEventDispatcher;
18
    /** @var LoggerInterface */
19
    private $logger;
20
    /** @var array */
21
    private $kernelConfig;
22
    /** @var bool */
23
    private $debugMode;
24
25
26
    /**
27
     * KernelFactory constructor.
28
     * @param BehatKernelEventDispatcher $behatKernelEventDispatcher
29
     * @param array                      $kernelConfig
30
     * @param boolean                    $debugMode
31
     */
32
    public function __construct(
33
        BehatKernelEventDispatcher $behatKernelEventDispatcher,
34
        LoggerInterface $logger,
35
        array $kernelConfig,
36
        $debugMode = false
37
    ) {
38
        $this->behatKernelEventDispatcher = $behatKernelEventDispatcher;
39
        $this->logger = $logger;
40
        $this->debugMode = $debugMode;
41
        $this->kernelConfig = $kernelConfig;
42
    }
43
44
    /**
45
     * @return KernelInterface
46
     *
47
     * @throws \Exception
48
     */
49
    public function load()
50
    {
51
        // Write the custom kernel file at same level than original one for autoloading purpose
52
        $originAppKernelDir = dirname($this->kernelConfig['path']);
53
        $bridgeId = uniqid();
54
        $kernelBridgeClassName = self::KERNEL_BRIDGE_CLASS_NAME.$bridgeId;
55
        $customAppKernelPath = sprintf('%s/%s.php', $originAppKernelDir, $kernelBridgeClassName);
56
57
        $this->logger->debug('Kernel bridge file path : "{file_path}"', ['file_path' => $customAppKernelPath]);
58
        try {
59
            /* /!\ YoanmBehat3SymfonyKernelBridge.php is just template file /!\ */
60
            $kernelBridgeTemplateFile = __DIR__.'/../Bridge/YoanmBehat3SymfonyKernelBridge.php';
61
            $this->logger->debug(
62
                'Loading kernel bridge template: "{file_path}"',
63
                ['file_path' => $kernelBridgeTemplateFile]
64
            );
65
            $template = file_get_contents($kernelBridgeTemplateFile);
66
67
            $this->logger->debug('Writing kernel bridge class');
68
            file_put_contents(
69
                $customAppKernelPath,
70
                $template = str_replace(
71
                    ['__BridgeId__', '__OriginalKernelClassNameToReplace__', self::KERNEL_BRIDGE_TEMPLATE_COMMENT],
72
                    [$bridgeId, $this->kernelConfig['class'], ''],
73
                    $template
74
                )
75
            );
76
77
            $this->logger->debug('Loading kernel bridge ...');
78
            require($customAppKernelPath);
79
            $this->logger->debug('Loading kernel bridge : DONE');
80
81
            $this->cleanKernelBridgeFile($customAppKernelPath);
82
83
            $this->logger->debug(
84
                'Instanciate kernel bridge with [env: {env}, debug: {debug}]',
85
                [
86
                    'env' => $this->kernelConfig['env'],
87
                    'debug' => $this->kernelConfig['debug'],
88
                ]
89
            );
90
91
            $kernelBridge = new $kernelBridgeClassName($this->kernelConfig['env'], $this->kernelConfig['debug']);
92
            $kernelBridge->setBehatKernelEventDispatcher($this->behatKernelEventDispatcher);
93
94
            $this->logger->debug('Kernel bridge init DONE');
95
96
            return $kernelBridge;
97
        } catch (\Exception $e) {
98
            $this->logger->error('Exception during kernel bridge init : "{message}"', ['message' => $e->getMessage()]);
99
            $this->cleanKernelBridgeFile($customAppKernelPath);
100
            throw new \Exception('An exception occured during Kernel decoration : '.$e->getMessage(), 0, $e);
101
        }
102
    }
103
104
    protected function cleanKernelBridgeFile($file)
105
    {
106
        if (false === $this->debugMode) {
107
            if (file_exists($file)) {
108
                $this->logger->debug('Removing kernel bridge file: "{file_path}"', ['file_path' => $file]);
109
                unlink($file);
110
            }
111
            //clean old bridge files too
112
            array_map(
113
                'unlink',
114
                glob(sprintf(
115
                    '%s/%s*.php',
116
                    dirname($this->kernelConfig['path']),
117
                    KernelFactory::KERNEL_BRIDGE_CLASS_NAME
118
                ))
119
            );
120
        }
121
    }
122
}
123