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

Popular posts from this blog

Converting A String To Int In Groovy

"Cannot Create Cache Directory /home//.composer/cache/repo/https---packagist.org/, Or Directory Is Not Writable. Proceeding Without Cache"

Android How Can I Convert A String To A Editable