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
Post a Comment