TwigRendererStrategy::__construct()   A
last analyzed

Complexity

Conditions 2
Paths 2

Size

Total Lines 6
Code Lines 2

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 3
CRAP Score 2

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 2
eloc 2
c 1
b 0
f 0
nc 2
nop 2
dl 0
loc 6
ccs 3
cts 3
cp 1
crap 2
rs 10
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\ExtensionInterface;
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 ExtensionInterface[]
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 ExtensionInterface[] $extensions Extensiones que se cargarán.
69
     */
70 2
    public function __construct(
71
        string|array $paths = [],
72
        array $extensions = []
73
    ) {
74 2
        $this->paths = is_string($paths) ? [$paths] : $paths;
0 ignored issues
show
introduced by
The condition is_string($paths) is always false.
Loading history...
75 2
        $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 2
    public function render(string $template, array &$data = []): string
86
    {
87
        //$config = $data['options']['config']['html'] ?? [];
88
89
        // Resolver plantilla.
90 2
        $template = $this->resolveTemplate($template);
91
92
        // Renderizar la plantilla.
93 2
        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 2
    private function getTwig(): Environment
105
    {
106 2
        if (!isset($this->twig)) {
107 2
            $this->twig = new Environment($this->getFilesystemLoader());
108 2
            foreach ($this->extensions as $extension) {
109 2
                assert($extension instanceof ExtensionInterface);
110 2
                $this->twig->addExtension($extension);
111
            }
112
        }
113
114 2
        return $this->twig;
115
    }
116
117
    /**
118
     * Entrega la instancia del cargador de plantillas desde el sistema de
119
     * archivos.
120
     *
121
     * @return FilesystemLoader
122
     */
123 2
    private function getFilesystemLoader(): FilesystemLoader
124
    {
125 2
        if (!isset($this->filesystemLoader)) {
126 2
            $this->filesystemLoader = new FilesystemLoader($this->paths);
127
        }
128
129 2
        return $this->filesystemLoader;
130
    }
131
132
    /**
133
     * Resuelve la plantilla que se está solicitando.
134
     *
135
     * Se encarga de:
136
     *
137
     *   - Agregar la extensión a la plantilla.
138
     *   - Agregar el directorio si se pasó una ruta absoluta de la plantilla.
139
     *
140
     * @param string $template
141
     * @return string
142
     */
143 2
    private function resolveTemplate(string $template): string
144
    {
145
        // Agregar extensión.
146 2
        if (!str_ends_with($template, '.html.twig')) {
147 2
            $template .= '.html.twig';
148
        }
149
150
        // Agregar el directorio si se pasó una ruta absoluta.
151 2
        if ($template[0] === '/') {
152 2
            $dir = dirname($template);
153 2
            $this->getFilesystemLoader()->addPath($dir);
154 2
            $template = basename($template);
155
        }
156
157
        // Entregar nombre de la plantilla.
158 2
        return $template;
159
    }
160
}
161