From 2e7fa33a3e01c5da77a3d4bdffc4ac1cfe6f39e7 Mon Sep 17 00:00:00 2001 From: Simon Vieille Date: Thu, 25 Mar 2021 09:34:58 +0100 Subject: [PATCH] add twig routing extension to generate url using Node --- core/Twig/Extension/RoutingExtension.php | 97 ++++++++++++++++++++++++ 1 file changed, 97 insertions(+) create mode 100644 core/Twig/Extension/RoutingExtension.php diff --git a/core/Twig/Extension/RoutingExtension.php b/core/Twig/Extension/RoutingExtension.php new file mode 100644 index 0000000..e57043e --- /dev/null +++ b/core/Twig/Extension/RoutingExtension.php @@ -0,0 +1,97 @@ +generator = $generator; + } + + /** + * {@inheritdoc} + */ + public function getFunctions(): array + { + return [ + new TwigFunction('node_url', [$this, 'getNodeUrl'], ['is_safe_callback' => [$this, 'isUrlGenerationSafe']]), + new TwigFunction('node_path', [$this, 'getNodePath'], ['is_safe_callback' => [$this, 'isUrlGenerationSafe']]), + new TwigFunction('safe_node_url', [$this, 'getSafeNodeUrl'], ['is_safe_callback' => [$this, 'isUrlGenerationSafe']]), + new TwigFunction('safe_node_path', [$this, 'getSafeNodePath'], ['is_safe_callback' => [$this, 'isUrlGenerationSafe']]), + ]; + } + + public function getNodePath(Node $node, array $parameters = [], bool $relative = false): ?string + { + if ($node->hasExternalUrl()) { + return $node->getUrl(); + } + + return $this->generator->generate( + $node->getRouteName(), + $parameters, + $relative ? UrlGeneratorInterface::RELATIVE_PATH : UrlGeneratorInterface::ABSOLUTE_PATH + ); + } + + public function getNodeUrl(Node $node, array $parameters = [], bool $schemeRelative = false): ?string + { + if ($node->hasExternalUrl()) { + return $node->getUrl(); + } + + return $this->generator->generate( + $node->getRouteName(), + $parameters, + $schemeRelative ? UrlGeneratorInterface::NETWORK_PATH : UrlGeneratorInterface::ABSOLUTE_URL + ); + } + + public function getSafeNodePath(Node $node, array $parameters = [], bool $relative = false): ?string + { + try { + return $this->getNodePath($node, $parameters, $relative); + } catch (\Exception $e) { + return null; + } + } + + public function getSafeNodeUrl(Node $node, array $parameters = [], bool $schemeRelative = false): ?string + { + try { + return $this->getNodeUrl($node, $parameters, $schemeRelative); + } catch (\Exception $e) { + return null; + } + } + + /** + * @see Symfony\Bridge\Twig\Extension\RoutingExtension::isUrlGenerationSafe + */ + public function isUrlGenerationSafe(TwigNode $argsNode): array + { + // support named arguments + $paramsNode = $argsNode->hasNode('parameters') ? $argsNode->getNode('parameters') : ( + $argsNode->hasNode(1) ? $argsNode->getNode(1) : null + ); + + if (null === $paramsNode || $paramsNode instanceof ArrayExpression && \count($paramsNode) <= 2 && + (!$paramsNode->hasNode(1) || $paramsNode->getNode(1) instanceof ConstantExpression) + ) { + return ['html']; + } + + return []; + } +}