Twig - Установить переменные ветки из manifest.json

Я пытаюсь реализовать среду Webpack в моих проектах Craft 3. Для того, чтобы динамически вызывать мои хэшированные ресурсы, я вывожу в manifest.json файл и импортировать его в мой шаблон.

manifest.json

{"app":["js/app3bfb132e4187389fccd4.js","css/app53079ca4a05210b4af0c.css"],"vendor":"js/vendor49171fe3f01c19da9296.js"}

index.twig

{% set manifest %}
    {% include './manifest.json' %}
{% endset %}

Выход этой переменной - строка. Есть ли в любом случае, чтобы закодировать его так, чтобы переменные были доступны / распечатаны с использованием только Twig? (С помощью {{ manifest.app }} например)

1 ответ

Вы должны сначала декодировать JSON. Я бы предложил один из двух подходов:

  • Создать кастом manifest функция для Twig, которая будет возвращать декодированный объект манифеста
  • или создать json_decode отфильтруйте Twig, декодируйте включенный контент json и используйте его

явная функция

<?php

namespace App\Twig;

class ManifestExtension extends \Twig_Extension
{
    private $manifestFile;

    public function __construct($manifestFile)
    {
        $this->manifestFile = $manifestFile;
    }

    public function getFunctions()
    {
        return array(
            new \Twig_SimpleFunction('manifest', array($this, 'manifest')),
        );
    }

    public function manifest()
    {
        $content = file_get_contents($this->manifestFile);

        return json_decode($content);
    }
}

Вы можете зарегистрировать его как услугу в services.yml указание пути к файлу manifest.json

App\Twig\ManifestExtension:
    class: 'App\Twig\ManifestExtension'
    arguments: ['%kernel.project_dir%/../public/manifest.json']
    tags: [twig.extension]

Использование:

{% set manifest = manifest() %}

фильтр json_decode

Это уже было покрыто здесь:

Расшифровка JSON в Twig

Использование:

{% set manifest %}
    {% include './manifest.json' %}
{% endset %}

{% set manifest = manifest | json_decode %}
Другие вопросы по тегам