Completed
Push — master ( d9217b...345cce )
by Nikola
05:50
created

TwigQuerySourceManager   A

Complexity

Total Complexity 11

Size/Duplication

Total Lines 79
Duplicated Lines 0 %

Coupling/Cohesion

Components 1
Dependencies 7

Test Coverage

Coverage 80.77%

Importance

Changes 0
Metric Value
wmc 11
lcom 1
cbo 7
dl 0
loc 79
ccs 21
cts 26
cp 0.8077
rs 10
c 0
b 0
f 0

5 Methods

Rating   Name   Duplication   Size   Complexity  
A __construct() 0 5 1
A has() 0 4 1
A registerExecutor() 0 4 1
B execute() 0 22 4
A get() 0 12 4
1
<?php
2
/*
3
 * This file is part of the QueryResourcesLoaderBundle, an RunOpenCode project.
4
 *
5
 * (c) 2017 RunOpenCode.
6
 *
7
 * For the full copyright and license information, please view the LICENSE
8
 * file that was distributed with this source code.
9
 */
10
namespace RunOpenCode\Bundle\QueryResourcesLoader\Manager;
11
12
use RunOpenCode\Bundle\QueryResourcesLoader\Contract\ExceptionInterface;
13
use RunOpenCode\Bundle\QueryResourcesLoader\Contract\ExecutorInterface;
14
use RunOpenCode\Bundle\QueryResourcesLoader\Contract\ManagerInterface;
15
use RunOpenCode\Bundle\QueryResourcesLoader\Exception\ExecutionException;
16
use RunOpenCode\Bundle\QueryResourcesLoader\Exception\RuntimeException;
17
use RunOpenCode\Bundle\QueryResourcesLoader\Exception\SourceNotFoundException;
18
use RunOpenCode\Bundle\QueryResourcesLoader\Exception\SyntaxException;
19
20
/**
21
 * Class TwigQuerySourceManager
22
 *
23
 * Twig powered query executor.
24
 *
25
 * @package RunOpenCode\Bundle\QueryResourcesLoader\Manager
26
 */
27
class TwigQuerySourceManager implements ManagerInterface
28
{
29
    /**
30
     * @var \Twig_Environment
31
     */
32
    protected $twig;
33
34
    /**
35
     * @var ExecutorInterface[]
36
     */
37
    protected $executors;
38
39 7
    public function __construct(\Twig_Environment $twig)
40
    {
41 7
        $this->twig = $twig;
42 7
        $this->executors = array();
43 7
    }
44
45
    /**
46
     * {@inheritdoc}
47
     */
48 5
    public function get($name, array $args = array())
49
    {
50
        try {
51 5
            return $this->twig->render($name, $args);
52 3
        } catch (\Twig_Error_Loader $e) {
53 1
            throw new SourceNotFoundException(sprintf('Could not find query source: "%s".', $name), 0, $e);
54 2
        } catch (\Twig_Error_Syntax $e) {
55 1
            throw new SyntaxException(sprintf('Query source "%s" contains Twig syntax error and could not be compiled.', $name), 0, $e);
56 1
        } catch (\Exception $e) {
57 1
            throw new RuntimeException('Unknown exception occured', 0, $e);
58
        }
59
    }
60
61
    /**
62
     * {@inheritdoc}
63
     */
64 2
    public function has($name)
65
    {
66 2
        return $this->twig->getLoader()->exists($name);
67
    }
68
69
    /**
70
     * {@inheritdoc}
71
     */
72 1
    public function execute($name, array $args = array(), array $types = array(), $executor = 'default')
73
    {
74 1
        if (!array_key_exists($executor, $this->executors)) {
75
            throw  new RuntimeException(sprintf('Requested executor "%s" does not exists.', $executor));
76
        }
77
78 1
        $executor = $this->executors[$executor];
79
80
        try {
81
            /**
82
             * @var ExecutorInterface $executor
83
             */
84 1
            return $executor->execute($this->get($name, $args), $args, $types);
85
        } catch (\Exception $e) {
86
87
            if ($e instanceof ExceptionInterface) {
88
                throw $e;
89
            }
90
91
            throw new ExecutionException(sprintf('Query "%s" could not be executed.', $name), 0, $e);
92
        }
93
    }
94
95
    /**
96
     * Register query executor.
97
     *
98
     * @param ExecutorInterface $executor
99
     * @param string $name
100
     */
101 6
    public function registerExecutor(ExecutorInterface $executor, $name)
102
    {
103 6
        $this->executors[$name] = $executor;
104 6
    }
105
}
106