在 Twig 中解码 JSON

2022-08-30 14:15:02

是否可以在树枝中解码JSON?谷歌搜索似乎没有产生任何关于此的结果。在Twig中解码JSON没有意义吗?


我正在尝试访问Symfony2的实体字段类型(实体字段类型)上的2个实体属性。

在遇到之前的2个SO问题(Symfony2实体字段类型替代“属性”或“__toString()”?Symfony 2创建一个具有2个属性的实体表单字段)之后,建议向实体添加一个额外的方法来检索自定义字符串而不是实体属性,我想到(并且确实)返回一个表示对象实例的JSON字符串。

实体类中的某个位置:

/**
 * Return a JSON string representing this class.
 */
public function getJson()
{
   return json_encode(get_object_vars($this));
}

在形式上(类似于):

$builder->add('categories', 'entity', array (
...
'property' => 'json',
...
));

之后,我希望在Twig中...json_decode

{% for category in form.categories %}
    {# json_decode() part is imaginary #}
    {% set obj = category.vars.label|json_decode() %}
{% endfor %}

答案 1

如果你伸出树枝,这很容易。

首先,创建一个将包含扩展的类:

<?php
 
namespace Acme\DemoBundle\Twig\Extension;

use Symfony\Component\DependencyInjection\ContainerInterface;  
use \Twig_Extension;

class VarsExtension extends Twig_Extension
{
    protected $container;
 
    public function __construct(ContainerInterface $container) 
    {
        $this->container = $container;
    }
      
    public function getName() 
    {
        return 'some.extension';
    }
    
    public function getFilters() {
        return array(
            'json_decode'   => new \Twig_Filter_Method($this, 'jsonDecode'),
        );
    }

    public function jsonDecode($str) {
        return json_decode($str);
    }
}

然后,在文件中注册该类:Services.xml

<service id="some_id" class="Acme\DemoBundle\Twig\Extension\VarsExtension">
        <tag name="twig.extension" />
        <argument type="service" id="service_container" />
</service>

然后,在树枝模板上使用它:

{% set obj = form_label(category) | json_decode %}

答案 2

我想出了一种获得我的JSON的方法,我想我会在这里分享它,以防它对其他人有用。

因此,在我的情况下,我可能有10条记录(布局)从mysql db返回,每行都有一个名为属性的字段,该字段是一个json字符串。因此,我可以轻松提取记录并将其发送到模板,如下所示:

echo $twig->render('template.html.twig', array(
      "layouts" => $layouts,
));

到目前为止,一切都很好,但是当我在树枝的布局%}中为布局做{%时,没有办法到达属性字段项,因为它们仍然是一个json字符串。

因此,就在我将$layouts传递给树枝模板之前,我执行了以下操作:

foreach($layouts as $i => $v)
{
      $layouts[$i]->decoded = json_decode($v->getProperties());
}

通过这样做,Ive在我的对象中动态创建了一个名为“解码”的变量,其中包含json解码对象。

所以现在在我的模板中,我可以通过{{ layout.decoded.whatever }}访问我的json项目

这可能有点黑客,而不是每个人都有一个好的解决方案的想法。我对我来说工作得很好,开销很小,这意味着我不必在到达模板之前完成工作,因为我需要扩展树枝。


推荐