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

时间:2015-01-21 13:21:02

标签: 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 %}

我觉得这样做很脏。必须有更好的方法来做到这一点吗?

提前致谢!

1 个答案:

答案 0 :(得分:8)

您可以使用Symfony Serializer。 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


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

作为JMSSerializerBundle的Symfony Serializer似乎很难应对双向关系(很可能是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');