Completed
Push — master ( 7fbbb0...53f538 )
by Oleg
03:37
created

getShortClassName()   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 ResourceMiddlewareFactoryGenerator implements GeneratorInterface
16
{
17
    /**
18
     * @var DataProviderInterface
19
     */
20
    private $dataProvider;
21
    /**
22
     * @var Environment
23
     */
24
    private $twig;
25
26 4
    public function __construct(DataProviderInterface $dataProvider)
27
    {
28 4
        $this->dataProvider = $dataProvider;
29 4
        $loader = new FilesystemLoader(__DIR__ . '/Templates');
30 4
        $this->twig = new Environment($loader);
31 4
    }
32
33
    /**
34
     * @return string
35
     * @throws \Twig_Error_Loader
36
     * @throws \Twig_Error_Runtime
37
     * @throws \Twig_Error_Syntax
38
     */
39 4
    public function generate(): string
40
    {
41 4
        $file = new PhpFile();
42 4
        $file->setStrictTypes();
43 4
        $file->addComment('This file is generated by SlayerBirden\DFCodeGeneration');
44
45 4
        $namespace = $file->addNamespace($this->getFactoryNamespace());
46 4
        $namespace->addUse(\Interop\Container\ContainerInterface::class);
47 4
        $namespace->addUse(\Psr\Log\LoggerInterface::class);
48 4
        $namespace->addUse($this->dataProvider->provide()['entityName']);
49 4
        $namespace->addUse(\Zend\ServiceManager\Factory\FactoryInterface::class);
50 4
        $namespace->addUse('SlayerBirden\DataFlowServer\Doctrine\Middleware\BaseResourceMiddleware');
51 4
        $namespace->addUse('SlayerBirden\DataFlowServer\Doctrine\Persistence\EntityManagerRegistry');
52 4
        $namespace->addUse('SlayerBirden\DataFlowServer\Doctrine\Middleware\ResourceMiddlewareInterface');
53
54 4
        $class = $namespace->addClass($this->getShortClassName());
55
56 4
        $class->addImplement(\Zend\ServiceManager\Factory\FactoryInterface::class)
57 4
            ->setFinal()
58 4
            ->addMethod('__invoke')
59 4
            ->setParameters([
60 4
                (new Parameter('container'))->setTypeHint(\Interop\Container\ContainerInterface::class),
61 4
                (new Parameter('requestedName')),
62 4
                (new Parameter('options'))->setTypeHint('array')->setDefaultValue(null)
63
            ])
64 4
            ->setReturnType('SlayerBirden\DataFlowServer\Doctrine\Middleware\ResourceMiddlewareInterface')
65 4
            ->setBody(
66 4
                $this->twig->load('ResourceMiddlewareFactory/Invoke.template.twig')
67 4
                    ->render($this->dataProvider->provide())
68
            )
69 4
            ->setVisibility(ClassType::VISIBILITY_PUBLIC);
70
71 4
        return (new PsrPrinter())->printFile($file);
72
    }
73
74
    public function getClassName(): string
75
    {
76
        return $this->getFactoryNamespace() . '\\' . $this->getShortClassName();
77
    }
78
79 4
    public function getFileName(): string
80
    {
81 4
        return sprintf(
82 4
            'src/%s/Factory/%s.php',
83 4
            $this->dataProvider->provide()['moduleName'],
84 4
            $this->getShortClassName()
85
        );
86
    }
87
88
    /**
89
     * @return string
90
     */
91 4
    private function getShortClassName(): string
92
    {
93 4
        return $this->dataProvider->provide()['entityClassName'] . 'ResourceMiddlewareFactory';
94
    }
95
96
    /**
97
     * @return string
98
     */
99 4
    private function getFactoryNamespace(): string
100
    {
101 4
        return $this->dataProvider->provide()['factory_namespace'];
102
    }
103
}
104