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 }})


person brunouno    schedule 18.12.2018    source источник
comment
вам нужно будет json_decode строку   -  person DarkBee    schedule 18.12.2018
comment
Родного json_decode в Twig нет :(   -  person brunouno    schedule 18.12.2018
comment
Добавить с помощью filter/function? См. здесь   -  person DarkBee    schedule 18.12.2018
comment
Если вы хотите использовать манифест для поиска «настоящих» имен файлов, компонент Symfony/asset предназначен для этого. symfony.com/doc/current/components/   -  person Alister Bulman    schedule 18.12.2018


Ответы (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 %}
person MakG    schedule 18.12.2018