Completed
Push — master ( 37a280...0c4ce1 )
by Yo
02:09
created

KernelFactory::__construct()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 13
Code Lines 11

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 7
CRAP Score 1

Importance

Changes 1
Bugs 0 Features 0
Metric Value
c 1
b 0
f 0
dl 0
loc 13
ccs 7
cts 7
cp 1
rs 9.4285
cc 1
eloc 11
nc 1
nop 5
crap 1
1
<?php
2
namespace Yoanm\Behat3SymfonyExtension\Factory;
3
4
use Symfony\Component\HttpKernel\KernelInterface;
5
use Yoanm\Behat3SymfonyExtension\Dispatcher\BehatKernelEventDispatcher;
6
7
class KernelFactory
8
{
9
    const KERNEL_BRIDGE_CLASS_NAME = 'YoanmBehat3SymfonyKernelBridge';
10
    const KERNEL_BRIDGE_TEMPLATE_COMMENT = <<<COMMENT
11
12
/******** WARNING : THIS FILE IS JUST A TEMPLATE, IT IS NOT LOADABLE AS IS ********/
13
COMMENT;
14
15
    /** @var BehatKernelEventDispatcher */
16
    private $behatKernelEventDispatcher;
17
    /** @var string */
18
    private $originalKernelPath;
19
    /** @var string */
20
    private $originalKernelClassName;
21
22
    /** @var string  */
23
    private $kernelEnvironment;
24
    /** @var bool */
25
    private $kernelDebug;
26
27
28
    /**
29
     * @param BehatKernelEventDispatcher $behatKernelEventDispatcher
30
     * @param string                     $originalKernelPath
31
     * @param string                     $originalKernelClassName
32
     * @param string                     $kernelEnvironment
33
     * @param bool                       $kernelDebug
34
     */
35 2
    public function __construct(
36
        BehatKernelEventDispatcher $behatKernelEventDispatcher,
37
        $originalKernelPath,
38
        $originalKernelClassName,
39
        $kernelEnvironment,
40
        $kernelDebug
41
    ) {
42 2
        $this->originalKernelPath = $originalKernelPath;
43 2
        $this->originalKernelClassName = $originalKernelClassName;
44 2
        $this->kernelEnvironment = $kernelEnvironment;
45 2
        $this->kernelDebug = $kernelDebug;
46 2
        $this->behatKernelEventDispatcher = $behatKernelEventDispatcher;
47 2
    }
48
49
    /**
50
     * @return KernelInterface
51
     *
52
     * @throws \Exception
53
     */
54 2
    public function load()
55
    {
56
        // Write the custom kernel file at same level than original one for autoloading purpose
57 2
        $originAppKernelDir = dirname($this->originalKernelPath);
58 2
        $bridgeId = uniqid();
59 2
        $kernelBridgeClassName = self::KERNEL_BRIDGE_CLASS_NAME.$bridgeId;
60 2
        $customAppKernelPath = sprintf('%s/%s.php', $originAppKernelDir, $kernelBridgeClassName);
61
        try {
62
            /* /!\ YoanmBehat3SymfonyKernelBridge.php is just template file /!\ */
63 2
            $template = file_get_contents(__DIR__.'/../Bridge/YoanmBehat3SymfonyKernelBridge.php');
64 2
            file_put_contents(
65 2
                $customAppKernelPath,
66 2
                $template = str_replace(
67 2
                    ['__BridgeId__', '__OriginalKernelClassNameToReplace__', self::KERNEL_BRIDGE_TEMPLATE_COMMENT],
68 2
                    [$bridgeId, $this->originalKernelClassName, ''],
69
                    $template
70 2
                )
71 2
            );
72
73 2
            require($customAppKernelPath);
74 2
            unlink($customAppKernelPath);
75
76 2
            $kernelBridge = new $kernelBridgeClassName($this->kernelEnvironment, $this->kernelDebug);
77 1
            $kernelBridge->setBehatKernelEventDispatcher($this->behatKernelEventDispatcher);
78
79 1
            return $kernelBridge;
80 1
        } catch (\Exception $e) {
81 1
            if (file_exists($customAppKernelPath)) {
82
                unlink($customAppKernelPath);
83
            }
84
85 1
            throw new \Exception('An exception occured during Kernel decoration : '.$e->getMessage(), 0, $e);
86
        }
87
    }
88
}
89