vendor/symfony/twig-bridge/Extension/RoutingExtension.php line 69

Open in your IDE?
  1. <?php
  2. /*
  3.  * This file is part of the Symfony package.
  4.  *
  5.  * (c) Fabien Potencier <fabien@symfony.com>
  6.  *
  7.  * For the full copyright and license information, please view the LICENSE
  8.  * file that was distributed with this source code.
  9.  */
  10. namespace Symfony\Bridge\Twig\Extension;
  11. use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
  12. use Twig\Extension\AbstractExtension;
  13. use Twig\Node\Expression\ArrayExpression;
  14. use Twig\Node\Expression\ConstantExpression;
  15. use Twig\Node\Node;
  16. use Twig\TwigFunction;
  17. /**
  18.  * Provides integration of the Routing component with Twig.
  19.  *
  20.  * @author Fabien Potencier <fabien@symfony.com>
  21.  *
  22.  * @final since Symfony 4.4
  23.  */
  24. class RoutingExtension extends AbstractExtension
  25. {
  26.     private $generator;
  27.     public function __construct(UrlGeneratorInterface $generator)
  28.     {
  29.         $this->generator $generator;
  30.     }
  31.     /**
  32.      * {@inheritdoc}
  33.      *
  34.      * @return TwigFunction[]
  35.      */
  36.     public function getFunctions()
  37.     {
  38.         return [
  39.             new TwigFunction('url', [$this'getUrl'], ['is_safe_callback' => [$this'isUrlGenerationSafe']]),
  40.             new TwigFunction('path', [$this'getPath'], ['is_safe_callback' => [$this'isUrlGenerationSafe']]),
  41.         ];
  42.     }
  43.     /**
  44.      * @param string $name
  45.      * @param array  $parameters
  46.      * @param bool   $relative
  47.      *
  48.      * @return string
  49.      */
  50.     public function getPath($name$parameters = [], $relative false)
  51.     {
  52.         return $this->generator->generate($name$parameters$relative UrlGeneratorInterface::RELATIVE_PATH UrlGeneratorInterface::ABSOLUTE_PATH);
  53.     }
  54.     /**
  55.      * @param string $name
  56.      * @param array  $parameters
  57.      * @param bool   $schemeRelative
  58.      *
  59.      * @return string
  60.      */
  61.     public function getUrl($name$parameters = [], $schemeRelative false)
  62.     {
  63.         return $this->generator->generate($name$parameters$schemeRelative UrlGeneratorInterface::NETWORK_PATH UrlGeneratorInterface::ABSOLUTE_URL);
  64.     }
  65.     /**
  66.      * Determines at compile time whether the generated URL will be safe and thus
  67.      * saving the unneeded automatic escaping for performance reasons.
  68.      *
  69.      * The URL generation process percent encodes non-alphanumeric characters. So there is no risk
  70.      * that malicious/invalid characters are part of the URL. The only character within an URL that
  71.      * must be escaped in html is the ampersand ("&") which separates query params. So we cannot mark
  72.      * the URL generation as always safe, but only when we are sure there won't be multiple query
  73.      * params. This is the case when there are none or only one constant parameter given.
  74.      * E.g. we know beforehand this will be safe:
  75.      * - path('route')
  76.      * - path('route', {'param': 'value'})
  77.      * But the following may not:
  78.      * - path('route', var)
  79.      * - path('route', {'param': ['val1', 'val2'] }) // a sub-array
  80.      * - path('route', {'param1': 'value1', 'param2': 'value2'})
  81.      * If param1 and param2 reference placeholder in the route, it would still be safe. But we don't know.
  82.      *
  83.      * @param Node $argsNode The arguments of the path/url function
  84.      *
  85.      * @return array An array with the contexts the URL is safe
  86.      *
  87.      * @final
  88.      */
  89.     public function isUrlGenerationSafe(Node $argsNode): array
  90.     {
  91.         // support named arguments
  92.         $paramsNode $argsNode->hasNode('parameters') ? $argsNode->getNode('parameters') : (
  93.             $argsNode->hasNode(1) ? $argsNode->getNode(1) : null
  94.         );
  95.         if (null === $paramsNode || $paramsNode instanceof ArrayExpression && \count($paramsNode) <= &&
  96.             (!$paramsNode->hasNode(1) || $paramsNode->getNode(1) instanceof ConstantExpression)
  97.         ) {
  98.             return ['html'];
  99.         }
  100.         return [];
  101.     }
  102.     /**
  103.      * {@inheritdoc}
  104.      */
  105.     public function getName()
  106.     {
  107.         return 'routing';
  108.     }
  109. }