解码JSON在枝条(Decoding JSON in Twig)

2019-07-18 16:01发布

是可以在JSON解码树枝? 谷歌搜索似乎并没有产生这事。 是否在枝条解码JSON没有意义?


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

在2个以前的做题来了之后( 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',
...
));

之后,我希望能json_decode它的树枝...

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

Answer 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 %}


Answer 2:

上述所有的替代方案
我不知道这是否是最佳的解决方案,但它的工作原理

1)创建一个辅助函数 ,并注册该功能的。

<?php
function twig_json_decode($json)
{
    return json_decode($json, true);
}


2)在树枝文件中使用此功能。

{% set res = twig_json_decode(json) %}
# above will return an array which can be iterated

{% for r is res %}
    {{ r }}
{% endfor %}


Answer 3:

我想出了让我的JSON的方式,我想我会在这里它usefult分享的情况下给别人。

所以在我来说,我也许有10条(布局)从MySQL数据库返回,每行有一个字段称为属性是一个JSON字符串。 所以,我可以轻松地拉出记录,并将其发送到像这样的模板:

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

到目前为止好,但是当我在树枝做我的{%布局在布局%}有没有办法去属性领域的项目,因为他们仍然是一个JSON字符串。

所以之前我通过$布局,以树枝模板,我做了以下内容:

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

通过这样做,香港专业教育学院创建的变量上我叫对象中的苍蝇“解码”它包含了JSON解码的对象。

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

这可能是一个有点哈克,而不是每个人一个很好的解决方案的想法。 我很适合我,非常小的开销,意味着我没有做手脚延伸树枝作为即时通讯做的工作是获取到模板之前。



Answer 4:

对于Symfony2.8或Symfony3更新的代码:

<?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';
    }

    // Note: If you want to use it as {{ json_decode(var) }} instead of 
    // {{ var|json_decode }} please use getFunctions() and 
    // new \Twig_SimpleFunction('json_decode', 'json_decode') 
    public function getFilters() {
        return [
            // Note that we map php json_decode function to 
            // extension filter of the same name
            new \Twig_SimpleFilter('json_decode', 'json_decode'),
        ];
    }
}


Answer 5:

在我来说,我已经得到了一个JsonArray在我的实体的话,我已经在我的实体梅索德添加

<?php
namespace ACME\DefaultBundle\Entity;
/*...*/    
public function getDecodedPath()
{
    return json_decode($this->path);
}


Answer 6:

这是一个老问题,但我加入我的备案解决方案...只是一个SimpleFunction延伸的树枝:

// Return a string of separated values from a JSON string
// Can optionally specify a separator.  If none provided, ", " is used.
$function = new Twig_SimpleFunction('json_to_list', function($json, $separator = ", ")
{
    $result = "";
    $array = json_decode($json, true);
    foreach ($array as $item)
    {
        if ($result != "") { $result .= $separator; }           
        $result .= $item;
    }
    return $result;
});
$twig->addFunction($function);

用法:

'[ “1”, “2”, “3”, “4”, “5”]' 调用枝条渲染之前设置a_json_variable到该字符串。

嫩枝模板:

The values are: {{ json_to_list(a_json_variable) }}

会产生

The values are: 1, 2, 3, 4, 5


Answer 7:

对于Symfony的3.1,作为官方文档说,没有用于此目的的帮手: return $this->json()

/**
 * @Route("/", name="homepage")
 * @Method({"GET","POST"})
 */
public function indexAction()
{
    $person = new Person();
    $form = $this->createForm(PersonType::class, $person,[
        'action'=>$this->generateUrl('homepage'),
        'method'=>'POST'
    ]);
    $form->handleRequest($request);
    if($form->isSubmitted() && $form->isValid()){
        return $this->json([
            'name'=>$person->getName(),
            'age'=>$person->getAge()
        ]);
    }
    return $this->render('default/index.html.twig',['form'=>$form->createView()]);
}

输出是这样的:

{"name":"john","age":39}


文章来源: Decoding JSON in Twig
标签: php symfony twig