Twig json_encode实体对象和集合 (Symfony3)



从我的控制器中,我将一个名为 Tag实体数组传递给 twig 文件,如下所示:

return $this->render('tags/list.html.twig', array(
    'tags' => $tags,
));

然后,我用 Twig for 在 HTML 中显示每个标签。每个Tag都有一个实体Texts集合(多种语言)。我想将 Texts 集合传递给 JS 以使用 jQuery 进行一些处理。

{% for tag in tags %}
    {% if tag.texts|default %}
        <div data-tag-texts="{{ tag.texts|json_encode }}">...</div>
    {% endif %}
    ...
{% endfor %}

但它在 JS 中返回一个空对象:Object {}而我的文本集合不为空。通常,文本是对象的对象。

我尝试了很多东西,但结果相同:

{{ tag.texts|json_encode }}
{{ tag.texts|json_encode(constant('JSON_PRETTY_PRINT'))|raw }}

我想浏览文本,以便在语言选项卡中向所有人显示。所有这些都在Boostrap Modal中。所以,我必须用javascript获取文本。

感谢您的帮助。

由于@Matteo的想法,我安装了Symfony的Serializer组件(而不是实现\JsonSerializable接口)。

在我的Tag实体中,我添加了:

use SymfonyComponentSerializerSerializer;
use SymfonyComponentSerializerEncoderJsonEncoder;
use SymfonyComponentSerializerNormalizerObjectNormalizer;
public function serializer() {
    $encoder = new JsonEncoder();
    $normalizer = new ObjectNormalizer();
    $normalizer->setIgnoredAttributes(array(
        'typeCode', 'type', 'range',
        'useCaseCode', 'useCase', 'updatedAt', 'updatedBy'));
    $normalizer->setCircularReferenceHandler(function ($object) {
        return $object->getName();
    });
    $serializer = new Serializer(array($normalizer), array($encoder));
    return $serializer->serialize($this, 'json');
}

这非常有用,因为我们可以选择属性并且具有实体关系。

在我的 Twig 文件中:

<div data-tag="{{ tag.serializer }}">...</div>

在JS中,我有我的标签对象。文本是对象的数组。一切都很好!

注意:小心你的Symfony版本。我的是 3.0.9,我无法安装序列化程序组件。我不得不将Symfony更新到3.2才能使其工作。

https://twigfiddle.com/ntexhi

基本文本看起来不错。我认为您必须使用非 UTF-8 字符,这会破坏您的编码,从而返回空 JSON。在将数据发送到 Twig 之前,请尝试utf8_encode您的数据。

最新更新