Add Extra Fields Using JMS Serializer Bundle
Answer :
I've found the solution by myself,
to add a custom field after the serialization has been done we've to create a listener class like this:
<?php namespace Acme\DemoBundle\Listener; use JMS\DiExtraBundle\Annotation\Service; use JMS\DiExtraBundle\Annotation\Tag; use JMS\DiExtraBundle\Annotation\Inject; use JMS\DiExtraBundle\Annotation\InjectParams; use Symfony\Component\HttpKernel\Event\PostResponseEvent; use Acme\DemoBundle\Entity\Team; use JMS\Serializer\Handler\SubscribingHandlerInterface; use JMS\Serializer\EventDispatcher\EventSubscriberInterface; use JMS\Serializer\EventDispatcher\PreSerializeEvent; use JMS\Serializer\EventDispatcher\ObjectEvent; use JMS\Serializer\GraphNavigator; use JMS\Serializer\JsonSerializationVisitor; /** * Add data after serialization * * @Service("acme.listener.serializationlistener") * @Tag("jms_serializer.event_subscriber") */ class SerializationListener implements EventSubscriberInterface { /** * @inheritdoc */ static public function getSubscribedEvents() { return array( array('event' => 'serializer.post_serialize', 'class' => 'Acme\DemoBundle\Entity\Team', 'method' => 'onPostSerialize'), ); } public function onPostSerialize(ObjectEvent $event) { $event->getVisitor()->addData('someKey','someValue'); } }
That way you can add data to the serialized element.
Instead, if you want to edit an object just before serialization use the pre_serialize event, be aware that you need to already have a variable (and the correct serialization groups) if you want to use pre_serialize for adding a value.
I am surprised why nobody have suggested a much more easier way. You need just to use @VirtualProperty:
<?php // ... /** * @JMS\VirtualProperty * @JMS\SerializedName("someField") */ public function getSomeField() { return $this->getTitle() . $this->getPromo(); }
To further answer the original question. Here is how you limit added data for some serialized groups (in this example some_data
is only added when we are not using the list
group:
public function onPostSerializeSomeEntityJson(ObjectEvent $event) { $entity = $event->getObject(); if (!in_array('list', (array)$event->getContext()->attributes->get('groups'))) { $event->getVisitor()->addData('user_access', array( 'some_data' => 'some_value' )); } }
(array)$event->getContext()->attributes->get('groups')
contains an array of the used serialized groups.
Comments
Post a Comment