3 declare(strict_types
=1);
7 use PhpMyAdmin\Container\ContainerBuilder
;
8 use PhpMyAdmin\Twig\AssetExtension
;
9 use PhpMyAdmin\Twig\CoreExtension
;
10 use PhpMyAdmin\Twig\FlashMessengerExtension
;
11 use PhpMyAdmin\Twig\I18nExtension
;
12 use PhpMyAdmin\Twig\MessageExtension
;
13 use PhpMyAdmin\Twig\PmaGlobalVariable
;
14 use PhpMyAdmin\Twig\SanitizeExtension
;
15 use PhpMyAdmin\Twig\TransformationsExtension
;
16 use PhpMyAdmin\Twig\UrlExtension
;
17 use PhpMyAdmin\Twig\UtilExtension
;
21 use Twig\Error\LoaderError
;
22 use Twig\Error\RuntimeError
;
23 use Twig\Error\SyntaxError
;
24 use Twig\Extension\DebugExtension
;
25 use Twig\Loader\FilesystemLoader
;
26 use Twig\RuntimeLoader\ContainerRuntimeLoader
;
27 use Twig\TemplateWrapper
;
30 * Handle front end templating
37 protected static Environment|
null $twig = null;
39 public const TEMPLATES_FOLDER
= ROOT_PATH
. 'resources/templates';
41 private Config
$config;
43 public function __construct(Config|
null $config = null)
45 $this->config
= $config ?? Config
::getInstance();
48 public static function getTwigEnvironment(string|
null $cacheDir, bool $isDevEnv): Environment
50 /* Twig expects false when cache is not configured */
51 if ($cacheDir === null) {
55 $loader = new FilesystemLoader(self
::TEMPLATES_FOLDER
);
56 $twig = new Environment($loader, ['auto_reload' => true, 'cache' => $cacheDir]);
58 $twig->addRuntimeLoader(new ContainerRuntimeLoader(ContainerBuilder
::getContainer()));
62 $twig->enableStrictVariables();
63 $twig->addExtension(new DebugExtension());
65 $twig->disableDebug();
66 $twig->disableStrictVariables();
69 $twig->addGlobal('pma', new PmaGlobalVariable());
70 $twig->addExtension(new AssetExtension());
71 $twig->addExtension(new CoreExtension());
72 $twig->addExtension(new FlashMessengerExtension());
73 $twig->addExtension(new I18nExtension());
74 $twig->addExtension(new MessageExtension());
75 $twig->addExtension(new SanitizeExtension());
76 $twig->addExtension(new TransformationsExtension());
77 $twig->addExtension(new UrlExtension());
78 $twig->addExtension(new UtilExtension());
86 * @param string $templateName Template path name
89 * @throws RuntimeError
92 private function load(string $templateName): TemplateWrapper
94 if (static::$twig === null) {
95 $isDevEnv = $this->config
->config
->environment
=== 'development';
96 static::$twig = self
::getTwigEnvironment(CACHE_DIR
. 'twig', $isDevEnv);
100 return static::$twig->load($templateName . '.twig');
101 } catch (RuntimeException
) { // @phpstan-ignore-line thrown by Twig\Cache\FilesystemCache
102 /* Retry with disabled cache */
103 static::$twig->setCache(false);
105 return static::$twig->load($templateName . '.twig');
110 * @param string $template Template path name
111 * @param mixed[] $data Associative array of template variables
114 * @throws LoaderError
115 * @throws RuntimeError
116 * @throws SyntaxError
118 public function render(string $template, array $data = []): string
120 return $this->load($template)->render($data);
123 public function disableCache(): void
125 if (static::$twig === null) {
126 static::$twig = self
::getTwigEnvironment(null, false);
129 static::$twig->setCache(false);