2013-09-23 5 views
8

FOSRestBundleとJMSシリアライザを使用して、ManyToOneリンクを持つJSONオブジェクト( 'Module')をSonata \ MediaBundle \ Entityに返そうとしています。それをどうやってやりますか?FOSRestbundle、JMSシリアライザとSonataMediaBundleは画像の公開URLを返します

ここで私がやったハックはありますが、それがベストプラクティスだとは思いません。

class Module 
{ 
    ... 
    /** 
    * @var Application\Sonata\MediaBundle\Entity\Media 
    * 
    * @ORM\ManyToOne(targetEntity="Application\Sonata\MediaBundle\Entity\Media", inversedBy="module") 
    * @ORM\JoinColumn(name="hero_image_id", referencedColumnName="id") 
    * @JMS\Expose() 
    */ 
    private $heroImage; 
    ... 
} 

class Media extends BaseMedia 
{ 
    ... 
    /** 
    * A Quick hack not the best method. 
    * 
    * @JMS\VirtualProperty 
    * @JMS\SerializedName("url") 
    * 
    * @return string 
    */ 
    public function getUrlMethod() 
    { 
     global $kernel; 

     $imageProvider = $kernel->getContainer()->get('sonata.media.provider.image'); 

     return $imageProvider->generatePublicUrl($this, 'reference'); 
    } 
    ... 
} 

ありがとう!

EDIT Tautrimas Pajarskasとその投稿に感謝します。 ここにクラスがあります。

<?php 
namespace AXO\APIBundle\Listener\Serialization; 

use JMS\DiExtraBundle\Annotation\Service; 
use JMS\DiExtraBundle\Annotation\Tag; 
use JMS\DiExtraBundle\Annotation\Inject; 
use JMS\DiExtraBundle\Annotation\InjectParams; 
use JMS\Serializer\EventDispatcher\EventSubscriberInterface; 
use JMS\Serializer\EventDispatcher\ObjectEvent; 
use JMS\Serializer\GraphNavigator; 

/** 
* Add data after serialization 
* 
* @Service("axo.listener.serializationlistener") 
* @Tag("jms_serializer.event_subscriber") 
*/ 
class SerializationListener implements EventSubscriberInterface 
{ 

    /** 
    * @inheritdoc 
    */ 
    static public function getSubscribedEvents() 
    { 
     return array(
      array('event' => 'serializer.post_serialize', 'class' => 'Application\Sonata\MediaBundle\Entity\Media', 'method' => 'onPostSerialize'), 
     ); 
    } 

    public function onPostSerialize(ObjectEvent $event) 
    { 
     global $kernel; 
     $imageProvider = $kernel->getContainer()->get('sonata.media.provider.image'); 

     $event->getVisitor()->addData('url',$imageProvider->generatePublicUrl($event->getObject(), 'reference')); 
    } 
} 
+1

そしてservices.ymlに、あなたはサービスを登録しますその方法: 'サービス: AXO.listener.serializationlistener: クラス:AXO \ APIBundle \リスナー\シリアライズ\ SerializationListener タグ: - {名:jms_serializer.event_subscriber 、イベント:serializer.post_serialize、メソッド:onPostSerialize} ' – Vaseltior

+0

なぜ、$ event-> getObject() - > getProviderName()のプロバイダがイメージプロバイダのハードコードではなく、 – ppetermann

答えて

関連する問題