vendor/shopware/core/Framework/Adapter/Twig/TwigVariableParser.php line 28

Open in your IDE?
  1. <?php declare(strict_types=1);
  2. namespace Shopware\Core\Framework\Adapter\Twig;
  3. use Shopware\Core\Framework\Log\Package;
  4. use Twig\Environment;
  5. use Twig\Loader\ArrayLoader;
  6. use Twig\Node\Expression\AssignNameExpression;
  7. use Twig\Node\Expression\ConstantExpression;
  8. use Twig\Node\Expression\GetAttrExpression;
  9. use Twig\Node\Expression\NameExpression;
  10. use Twig\Node\ForNode;
  11. use Twig\Node\Node;
  12. #[Package('core')]
  13. class TwigVariableParser
  14. {
  15.     private Environment $twig;
  16.     /**
  17.      * @internal
  18.      */
  19.     public function __construct(Environment $twig)
  20.     {
  21.         $this->twig $twig;
  22.     }
  23.     public function parse(string $template): array
  24.     {
  25.         $loader = new ArrayLoader(['content.html.twig' => $template]);
  26.         $source $loader->getSourceContext('content.html.twig');
  27.         $stream $this->twig->tokenize($source);
  28.         $parsed $this->twig->parse($stream);
  29.         return array_values($this->getVariables($parsed));
  30.     }
  31.     private function getVariables(iterable $nodes, array $aliases = []): array
  32.     {
  33.         $variables = [];
  34.         foreach ($nodes as $node) {
  35.             if ($node instanceof AssignNameExpression) {
  36.                 continue;
  37.             }
  38.             if ($node instanceof NameExpression) {
  39.                 $name $node->getAttribute('name');
  40.                 if (isset($aliases[$name])) {
  41.                     $name $aliases[$name];
  42.                 }
  43.                 $variables[$name] = $name;
  44.                 continue;
  45.             }
  46.             if ($node instanceof ConstantExpression && $nodes instanceof GetAttrExpression) {
  47.                 $value $node->getAttribute('value');
  48.                 if (!empty($value) && \is_string($value)) {
  49.                     $variables[$value] = $value;
  50.                 }
  51.                 continue;
  52.             }
  53.             if ($node instanceof GetAttrExpression) {
  54.                 $path implode('.'$this->getVariables($node$aliases));
  55.                 if (!empty($path)) {
  56.                     $variables[$path] = $path;
  57.                 }
  58.                 continue;
  59.             }
  60.             if ($node instanceof ForNode) {
  61.                 $target implode('.'$this->getVariables($node->getNode('seq'), $aliases));
  62.                 $source $node->getNode('value_target')->getAttribute('name');
  63.                 $aliases[$source] = $target;
  64.             }
  65.             if ($node instanceof Node) {
  66.                 $variables += $this->getVariables($node$aliases);
  67.             }
  68.         }
  69.         return $variables;
  70.     }
  71. }