Completed
Push — master ( b95763...2cb7d7 )
by Nikola
29:49
created

TwigQuerySourceManager   A

Complexity

Total Complexity 11

Size/Duplication

Total Lines 79
Duplicated Lines 0 %

Coupling/Cohesion

Components 1
Dependencies 6

Importance

Changes 1
Bugs 0 Features 1
Metric Value
c 1
b 0
f 1
dl 0
loc 79
wmc 11
lcom 1
cbo 6
rs 10

5 Methods

Rating   Name   Duplication   Size   Complexity  
A __construct() 0 5 1
A get() 0 12 4
A has() 0 4 1
B execute() 0 22 4
A registerExecutor() 0 4 1
1
<?php
2
/*
3
 * This file is part of the QueryResourcesLoaderBundle, an RunOpenCode project.
4
 *
5
 * (c) 2016 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
    public function __construct(\Twig_Environment $twig)
40
    {
41
        $this->twig = $twig;
42
        $this->executors = array();
43
    }
44
45
    /**
46
     * {@inheritdoc}
47
     */
48
    public function get($name, array $args = array())
49
    {
50
        try {
51
            return $this->twig->render($name, $args);
52
        } catch (\Twig_Error_Loader $e) {
53
            throw new SourceNotFoundException(sprintf('Could not find query source: "%s".', $name), 0, $e);
54
        } catch (\Twig_Error_Syntax $e) {
55
            throw new SyntaxException(sprintf('Query source "%s" contains Twig syntax error and could not be compiled.', $name), 0, $e);
56
        } catch (\Exception $e) {
57
            throw new RuntimeException('Unknown exception occured', 0, $e);
58
        }
59
    }
60
61
    /**
62
     * {@inheritdoc}
63
     */
64
    public function has($name)
65
    {
66
        return $this->twig->getLoader()->exists($name);
67
    }
68
69
    /**
70
     * {@inheritdoc}
71
     */
72
    public function execute($name, array $args = array(), $executor = 'default')
73
    {
74
        if (!array_key_exists($executor, $this->executors)) {
75
            throw  new RuntimeException(sprintf('Requested executor "%s" does not exists.', $executor));
76
        }
77
78
        $executor = $this->executors[$executor];
79
80
        try {
81
            /**
82
             * @var ExecutorInterface $executor
83
             */
84
            return $executor->execute($this->get($name, $args), $args);
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
    public function registerExecutor(ExecutorInterface $executor, $name)
102
    {
103
        $this->executors[$name] = $executor;
104
    }
105
}
106