Completed
Push — master ( f81cf6...7fbbb0 )
by Oleg
03:40
created

HydratorFactoryGenerator::getSingleDeps()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 3
Code Lines 1

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 2
CRAP Score 1

Importance

Changes 0
Metric Value
cc 1
eloc 1
nc 1
nop 0
dl 0
loc 3
rs 10
c 0
b 0
f 0
ccs 2
cts 2
cp 1
crap 1
1
<?php
2
declare(strict_types=1);
3
4
namespace SlayerBirden\DFCodeGeneration\Generator\Factory;
5
6
use Nette\PhpGenerator\ClassType;
7
use Nette\PhpGenerator\Parameter;
8
use Nette\PhpGenerator\PhpFile;
9
use Nette\PhpGenerator\PsrPrinter;
10
use SlayerBirden\DFCodeGeneration\Generator\DataProvider\DataProviderInterface;
11
use SlayerBirden\DFCodeGeneration\Generator\GeneratorInterface;
12
use Twig\Environment;
13
use Twig\Loader\FilesystemLoader;
14
15
final class HydratorFactoryGenerator implements GeneratorInterface
16
{
17
    /**
18
     * @var DataProviderInterface
19
     */
20
    private $dataProvider;
21
    /**
22
     * @var Environment
23
     */
24
    private $twig;
25
26 2
    public function __construct(DataProviderInterface $dataProvider)
27
    {
28 2
        $this->dataProvider = $dataProvider;
29 2
        $loader = new FilesystemLoader(__DIR__ . '/Templates');
30 2
        $this->twig = new Environment($loader);
31 2
    }
32
33
    /**
34
     * @return string
35
     * @throws \Twig_Error_Loader
36
     * @throws \Twig_Error_Runtime
37
     * @throws \Twig_Error_Syntax
38
     */
39 2
    public function generate(): string
40
    {
41 2
        $file = new PhpFile();
42 2
        $file->setStrictTypes();
43 2
        $file->addComment('This file is generated by SlayerBirden\DFCodeGeneration');
44
45 2
        $namespace = $file->addNamespace($this->getFactoryNamespace());
46 2
        if (!empty($this->getSingleDeps())) {
47
            $namespace->addUse('\SlayerBirden\DataFlowServer\Doctrine\Hydrator\Strategy\NestedEntityStrategy');
48
        }
49 2
        if (!empty($this->getMultiDeps())) {
50
            $namespace->addUse('\SlayerBirden\DataFlowServer\Doctrine\Hydrator\Strategy\CollectionStrategy');
51
        }
52 2
        $namespace->addUse(\Zend\Hydrator\ClassMethods::class);
53 2
        $namespace->addUse(\Zend\ServiceManager\Factory\FactoryInterface::class);
54 2
        $namespace->addUse(\Zend\Hydrator\HydratorInterface::class);
55
56 2
        $class = $namespace->addClass($this->getShortClassName());
57
58 2
        $class->addMethod('__invoke')
59 2
            ->setParameters([
60 2
                (new Parameter('container'))->setTypeHint(\Interop\Container\ContainerInterface::class),
61 2
                (new Parameter('requestedName')),
62 2
                (new Parameter('options'))->setTypeHint('array')->setDefaultValue(null)
63
            ])
64 2
            ->setReturnType(\Zend\Hydrator\HydratorInterface::class)
65 2
            ->setBody(
66 2
                $this->twig->load('HydratorFactory/Invoke.template.twig')->render($this->dataProvider->provide())
67
            )
68 2
            ->setVisibility(ClassType::VISIBILITY_PUBLIC);
69
70 2
        return (new PsrPrinter())->printFile($file);
71
    }
72
73
    public function getClassName(): string
74
    {
75
        return $this->getFactoryNamespace() . '\\' . $this->getShortClassName();
76
    }
77
78 2
    public function getFileName(): string
79
    {
80 2
        return sprintf(
81 2
            'src/%s/Factory/%s.php',
82 2
            $this->dataProvider->provide()['entityClassName'],
83 2
            $this->getShortClassName()
84
        );
85
    }
86
87
    /**
88
     * @return string
89
     */
90 2
    private function getShortClassName(): string
91
    {
92 2
        return $this->dataProvider->provide()['hydrator_factory_name'];
93
    }
94
95
    /**
96
     * @return string
97
     */
98 2
    private function getFactoryNamespace(): string
99
    {
100 2
        return $this->dataProvider->provide()['factory_namespace'];
101
    }
102
103 2
    private function getSingleDeps(): array
104
    {
105 2
        return $this->dataProvider->provide()['single_deps'];
106
    }
107
108 2
    private function getMultiDeps(): array
109
    {
110 2
        return $this->dataProvider->provide()['multi_deps'];
111
    }
112
}
113