Я пытаюсь открыть данные из объекта PHP (как показано ниже), но я хотел бы иметь доступ к этим данным в JavaScript для использования в графической библиотеке.
Объект, о котором идет речь:
То, что мне нужно, это преобразовать его в JSON-закодированный объект для использования в Javascript.
Я попытался использовать twig в Symfony, чтобы сделать это через:
{% set playerStats = match.getStatsPlayers().getValues() }% {% dump(playerStats) %} // This is what you see above var playerStats = {{ playerStats|json_encode }}; console.log(playerStats);
Консоль показывает это:
Вот где я стучу головой о стену. Где я могу получить доступ к значениям этих свойств?
Как неэффективный способ, мне удалось получить его в объекте 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 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
Обновление, чтобы дать краткий обзор того, что находится в комментариях.
Как Symfony Serializer, так и JMSSerializerBundle, похоже, трудно справиться с двунаправленными отношениями (скорее всего, с Доктриной). Это приведет к ошибкам, например, «Недостаточно памяти» или что-то, что касается объектов «Self-referencing» / бесконечных циклов.
Чтобы решить эту проблему, вы можете игнорировать атрибут с помощью 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');