javascript - 转换 Symfony2 PHP 实体对象以在 Javascript 中使用

标签 javascript php symfony object twig

我正在尝试从 PHP 对象(如下所示)打开数据,但我希望能够在 JavaScript 中访问此数据以在图形库中使用。

有问题的对象:

http://puu.sh/eP3QZ/e4289eb0d8.png

我需要做的是将其转换为 JSON 编码对象,以便在 Javascript 中使用。

我尝试在 Symfony 中使用 twig 通过以下方式做到这一点:

{% set playerStats = match.getStatsPlayers().getValues() }%
{% dump(playerStats) %} // This is what you see above

var playerStats = {{ playerStats|json_encode }};

console.log(playerStats);

控制台显示:

http://puu.sh/eP4aX/adf6c9978f.png

这就是我用头撞墙的地方。我在哪里可以访问这些属性的值?

作为一种低效的方式,我设法通过以下方式将其放入 JavaScript 对象中:

{% for p in playerStats %}
    playerStats.push({ 'id': {{p.playerID}}, 'playerName': '{{p.playerName}}', 'playerOutfit': {{p.playerOutfit}}, 'playerFaction': {{p.playerFaction}}, 'playerKills': {{p.playerKills}}, 'playerDeaths': {{p.playerDeaths}}, 'playerTeamKills': {{p.playerTeamKills}}, 'playerSuicides': {{p.playerSuicides}} });
{% endfor %}

我觉得这样做有点脏。一定有更好的方法来做到这一点吧?

提前致谢!

最佳答案

您可以使用 Symfony 序列化器。 http://symfony.com/doc/current/components/serializer.html

您可能想编写自己的 Twig 扩展以在您的模板中执行此操作。

您的代码将如下所示:

use Symfony\Component\Serializer\Serializer;
use Symfony\Component\Serializer\Encoder\JsonEncoder;
use Symfony\Component\Serializer\Normalizer\GetSetMethodNormalizer;

$encoders = array(new JsonEncoder());
$normalizers = array(new GetSetMethodNormalizer());

$serializer = new Serializer($normalizers, $encoders);

$jsonContent = $serializer->serialize($object, 'json');

当你将该字符串放入 javascript 时,你应该有一个普通的 JS 对象,你可以在其中找到你想要的一切。

您可能想要使用 JMSSerializerBundle,因为它已经有了 Twig 扩展,并且通常更易于使用。

https://github.com/schmittjoh/JMSSerializerBundle/blob/master/Resources/doc/index.rst


更新以快速概述评论中的内容。

Symfony Serializer 和 JMSSerializerBundle 似乎都很难处理双向关系(很可能是 Doctrine)。 这将导致诸如“内存不足”或提及“自引用”对象/无限循环之类的错误。

要解决这个问题,您可以使用 Normalizer 忽略该属性。这看起来像:

use Symfony\Component\Serializer\Serializer;
use Symfony\Component\Serializer\Encoder\JsonEncoder;
use Symfony\Component\Serializer\Normalizer\GetSetMethodNormalizer;

$normalizer = new GetSetMethodNormalizer();
$normalizer->setIgnoredAttributes(array('match')); //Replace match with the parent attribute
$encoder = new JsonEncoder();

$serializer = new Serializer(array($normalizer), array($encoder));
$serializer->serialize($object, 'json');

关于javascript - 转换 Symfony2 PHP 实体对象以在 Javascript 中使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28068305/

相关文章:

javascript - 如何创建动态命名的 JavaScript 对象属性?

javascript - 使用 React 和 Google App 脚本将文件上传到 Google Drive

javascript - 无法过滤 AJAX 请求中的数据

php - Symfony 2 - 每个实体实例的表单

php - 存储其中包含 unicode 字符的字符串

php - Symfony 2,传递变量

javascript - 为什么浏览器限制在 Canvas 中使用来自其他域的图像?

javascript - 视频海报上的事件已加载

php - Yii2 + redis类报错

javascript - 我怎样才能在php中获取表单字段的值(字段是从javascript创建的)?