rest - How to get the image url from a gallery in sonata media bundle, for use it with FOSRestBundle? -


i'm working on mobile app has show images of houses server. have installed symfony2, fosrestbundle , sonata media bundle backend.

in order houses images urls, have configured fosrestbundle entity named property has gallery field. rest controller

class propertiescontroller extends fosrestcontroller {      public function getpropertiesaction()     {         $response = $this->getdoctrine()->getrepository('comissionbundle:property')->findall();         if ($response == null){             return "no properties";         }         else{             return $response;         }      }  } 

but this:

[      {         "id":2,       "name":"test",       "city":"test",       "address":"test",       "sector":"test",       "area":0,       "rooms":112343,       "price":0,       "gallery":{            "context":"default",          "name":"test",          "enabled":false,          "updated_at":"2016-08-26t17:18:51+0200",          "created_at":"2016-08-26t17:18:51+0200",          "default_format":"default_small",          "id":1       }    } ] 

as can see, there no media objects.

then, tried customized repository method:

class propertyrepository extends entityrepository {     public function findmaininfoelements($elements)     {         $em = $this->getentitymanager();          $querytext  = "select u, g, h comissionbundle:property u join u.gallery g join g.galleryhasmedias h";          $query = $em->createquery($querytext);          return $query->setmaxresults($elements)->getresult();     } } 

but result same.

how can urls gallery in order show them in mobile app? (especially thumb images sonata media bundle generates, better app performance)

i guess should join galleryhasmedia entity media entity in propertyrepository query, not enough. should create custom serialization handler media entity too.

declare serialization handler

myapp.serialization.media_handler:     class: path\toyourapp\serializer\mediaserializationhandler     tags:         - { name: jms_serializer.handler, type: path\toyourmedia\entity\media, direction: serialization, format: json, method: serializemedia }     arguments: [ @sonata.media.provider.image, @sonata.media.provider.file ] 

create serialization handler

<?php  namespace camelot\social\apibundle\serializer;  use path\toyourmedia\entity\media;  use jms\serializer\jsonserializationvisitor; use jms\serializer\context; use sonata\mediabundle\provider\imageprovider; use sonata\mediabundle\provider\fileprovider;  class mediaserializationhandler {     /**      * @var imageprovider      */     private $imageprovider;      /**      * @var fileprovider      */     private $fileprovider;      public function __construct(imageprovider $imageprovider, fileprovider $fileprovider)     {         $this->imageprovider = $imageprovider;         $this->fileprovider = $fileprovider;     }      public function serializemedia(jsonserializationvisitor $visitor, media $media, array $type, context $context)     {          switch ($media->getprovidername()) {             case 'sonata.media.provider.file':                 $serialization = $this->serializefile($media);                 break;              case 'sonata.media.provider.image':                 $serialization = $this->serializeimage($media);                 break;              default:                 throw new \runtimeexception("serialization media provider not recognized");         }          if ($visitor->getroot() === null) {             $visitor->setroot($serialization);         }          return $serialization;     }      private function serializeimage(media $media)     {         // here can provide 1 ore more urls based on sonatamedia configuration         // can add more properties coming media entity based on needs (e.g. authorname, description, copyright etc)         return [             "url" => [                 "orig" => $this->imageprovider->generatepublicurl($media, "reference"),                 "small" => $this->imageprovider->generatepublicurl($media, "default_small"),                 "big" => $this->imageprovider->generatepublicurl($media, "default_big"),             ]         ];     }      private function serializefile(media $media)     {         return [             "name" => $media->getname(),             "size" => $media->getsize(),             "url" => $this->fileprovider->generatepublicurl($media, 'reference')         ];     } } 

Comments

Popular posts from this blog

amazon web services - S3 Pre-signed POST validate file type? -

c# - Check Keyboard Input Winforms -