从我的 Controller 中,我将一个名为 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的想法,我安装了Serializer Component Symfony 的(而不是实现\JsonSerialized 接口(interface))。
在我的 Tag
实体中,我添加了:
use Symfony\Component\Serializer\Serializer;
use Symfony\Component\Serializer\Encoder\JsonEncoder;
use Symfony\Component\Serializer\Normalizer\ObjectNormalizer;
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 才能使其正常工作。
关于javascript - Twig json_encode 与实体对象和集合(Symfony3),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41933455/