Twig-从manifest.json设置twig变量

时间:2018-12-18 18:20:09

标签: json symfony twig templating craftcms

我正在尝试在Craft 3项目上实现Webpack环境。为了动态调用散列的资源,我将在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 个答案:

答案 0 :(得分:1)

您必须先解码JSON。我建议使用以下两种方法之一:

  • 为Twig创建自定义manifest函数,该函数将返回解码的清单对象
  • 或为Twig创建json_decode过滤器,解码包含的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过滤器

这里已经介绍过了:

Decoding JSON in Twig

用法:

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

{% set manifest = manifest | json_decode %}