2016-08-29 1 views
0

私はサーバーから家のいくつかの画像を表示する必要があるモバイルアプリに取り組んでいます。バックエンド用にSymfony2、FOSRestBundle、Sonata Media Bundleをインストールしました。FOSRestBundleで使用するために、ソナタのメディアバンドルのギャラリーからイメージURLを取得するにはどうすればいいですか?

ハウス画像のURLを取得するために、ギャラリーフィールドを持つPropertyという名前のエンティティに対してFOSRestBundleを設定しました。これは、RESTコントローラ

class PropertiesController extends FOSRestController 
{ 

    public function getPropertiesAction() 
    { 
     $response = $this->getDoctrine()->getRepository('ComissionBundle:Property')->findAll(); 
     if ($response == null){ 
      return "No properties"; 
     } 
     else{ 
      return $response; 
     } 

    } 

} 

ですが、私はこれを取得する:あなたが見ることができるように

[ 
    { 
     "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 
     } 
    } 
] 

、何のメディアオブジェクトが存在しません。

そして、Iカスタマイズリポジトリ方法で試みた:

class PropertyRepository extends EntityRepository 
{ 
    public function findMainInfoElements($elements) 
    { 
     $em = $this->getEntityManager(); 

     $queryText = "SELECT u, g, h FROM ComissionBundle:Property u JOIN u.gallery g JOIN g.galleryHasMedias h"; 

     $query = $em->createQuery($queryText); 

     return $query->setMaxResults($elements)->getResult(); 
    } 
} 

が、結果は同じです。

ギャラリーからURLを取得してモバイルアプリに表示するにはどうすればよいですか? (特にSonata Media Bundleが生成するサム画像は、アプリケーションのパフォーマンスに優れています)

答えて

0

MediaHandMediaエンティティにPropertyRepositoryクエリでも参加する必要がありますが、十分ではありません。 Mediaエンティティ用のカスタムシリアル化ハンドラも作成する必要があります。

シリアライズハンドラを宣言し

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 ] 

シリアライズハンドラ

<?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 you can provide one ore more URLs based on your SonataMedia configuration 
     // you can also add some more properties coming from the media entity based on your 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') 
     ]; 
    } 
} 
を作成します。
関連する問題