Test Failed
Push — master ( 4516e7...6ee9d0 )
by Esteban De La Fuente
04:23
created

TwigRendererStrategy   A

Complexity

Total Complexity 11

Size/Duplication

Total Lines 122
Duplicated Lines 0 %

Test Coverage

Coverage 0%

Importance

Changes 1
Bugs 0 Features 0
Metric Value
eloc 24
dl 0
loc 122
ccs 0
cts 24
cp 0
rs 10
c 1
b 0
f 0
wmc 11

5 Methods

Rating   Name   Duplication   Size   Complexity  
A resolveTemplate() 0 16 3
A __construct() 0 6 2
A getFilesystemLoader() 0 7 2
A getTwig() 0 10 3
A render() 0 9 1
1
<?php
2
3
declare(strict_types=1);
4
5
/**
6
 * Derafu: Biblioteca PHP (Núcleo).
7
 * Copyright (C) Derafu <https://www.derafu.org>
8
 *
9
 * Este programa es software libre: usted puede redistribuirlo y/o modificarlo
10
 * bajo los términos de la Licencia Pública General Affero de GNU publicada por
11
 * la Fundación para el Software Libre, ya sea la versión 3 de la Licencia, o
12
 * (a su elección) cualquier versión posterior de la misma.
13
 *
14
 * Este programa se distribuye con la esperanza de que sea útil, pero SIN
15
 * GARANTÍA ALGUNA; ni siquiera la garantía implícita MERCANTIL o de APTITUD
16
 * PARA UN PROPÓSITO DETERMINADO. Consulte los detalles de la Licencia Pública
17
 * General Affero de GNU para obtener una información más detallada.
18
 *
19
 * Debería haber recibido una copia de la Licencia Pública General Affero de GNU
20
 * junto a este programa.
21
 *
22
 * En caso contrario, consulte <http://www.gnu.org/licenses/agpl.html>.
23
 */
24
25
namespace Derafu\Lib\Core\Package\Prime\Component\Template\Worker\Renderer\Strategy;
26
27
use Derafu\Lib\Core\Foundation\Abstract\AbstractStrategy;
28
use Derafu\Lib\Core\Package\Prime\Component\Template\Contract\Renderer\Strategy\HtmlRendererStrategyInterface;
29
use Twig\Environment;
30
use Twig\Extension\AbstractExtension;
31
use Twig\Loader\FilesystemLoader;
32
33
/**
34
 * Estrategia de renderizado de archivos HTML mediante Twig (.html.twig).
35
 */
36
class TwigRendererStrategy extends AbstractStrategy implements HtmlRendererStrategyInterface
37
{
38
    /**
39
     * Renderizador de plantillas HTML con Twig.
40
     *
41
     * @var Environment
42
     */
43
    private Environment $twig;
44
45
    /**
46
     * Cargador de plantillas mediante el sistema de archivos para Twig.
47
     */
48
    private FilesystemLoader $filesystemLoader;
49
50
    /**
51
     * Rutas donde están las plantillas.
52
     *
53
     * @var array
54
     */
55
    private array $paths;
56
57
    /**
58
     * Extensiones de Twig que se utilizarán al renderizar.
59
     *
60
     * @var AbstractExtension[]
61
     */
62
    private array $extensions;
63
64
    /**
65
     * Constructor de la estrategia.
66
     *
67
     * @param string|array $paths Rutas dónde se buscarán las plantillas.
68
     * @param AbstractExtension[] $extensions Extensiones que se cargarán.
69
     */
70
    public function __construct(
71
        string|array $paths = [],
72
        array $extensions = []
73
    ) {
74
        $this->paths = is_string($paths) ? [$paths] : $paths;
0 ignored issues
show
introduced by
The condition is_string($paths) is always false.
Loading history...
75
        $this->extensions = $extensions;
76
    }
77
78
    /**
79
     * Renderiza una plantilla Twig en HTML.
80
     *
81
     * @param string $template Plantilla Twig a renderizar.
82
     * @param array $data Datos que se pasarán a la plantilla Twig.
83
     * @return string Código HTML con el renderizado de la plantilla Twig.
84
     */
85
    public function render(string $template, array &$data = []): string
86
    {
87
        //$config = $data['options']['config']['html'] ?? [];
88
89
        // Resolver plantilla.
90
        $template = $this->resolveTemplate($template);
91
92
        // Renderizar la plantilla.
93
        return $this->getTwig()->render($template, $data);
94
    }
95
96
    /**
97
     * Entrega la instancia de Twig.
98
     *
99
     * Este método evita crearla en el constructor y se crea solo cuando
100
     * realmente se utiliza. Útil porque los workers son lazy services.
101
     *
102
     * @return Environment
103
     */
104
    private function getTwig(): Environment
105
    {
106
        if (!isset($this->twig)) {
107
            $this->twig = new Environment($this->getFilesystemLoader());
108
            foreach ($this->extensions as $extension) {
109
                $this->twig->addExtension($extension);
110
            }
111
        }
112
113
        return $this->twig;
114
    }
115
116
    /**
117
     * Entrega la instancia del cargador de plantillas desde el sistema de
118
     * archivos.
119
     *
120
     * @return FilesystemLoader
121
     */
122
    private function getFilesystemLoader(): FilesystemLoader
123
    {
124
        if (!isset($this->filesystemLoader)) {
125
            $this->filesystemLoader = new FilesystemLoader($this->paths);
126
        }
127
128
        return $this->filesystemLoader;
129
    }
130
131
    /**
132
     * Resuelve la plantilla que se está solicitando.
133
     *
134
     * Se encarga de:
135
     *
136
     *   - Agregar la extensión a la plantilla.
137
     *   - Agregar el directorio si se pasó una ruta absoluta de la plantilla.
138
     *
139
     * @param string $template
140
     * @return string
141
     */
142
    private function resolveTemplate(string $template): string
143
    {
144
        // Agregar extensión.
145
        if (!str_ends_with($template, '.html.twig')) {
146
            $template .= '.html.twig';
147
        }
148
149
        // Agregar el directorio si se pasó una ruta absoluta.
150
        if ($template[0] === '/') {
151
            $dir = dirname($template);
152
            $this->getFilesystemLoader()->addPath($dir);
153
            $template = basename($template);
154
        }
155
156
        // Entregar nombre de la plantilla.
157
        return $template;
158
    }
159
}
160