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'));
}
}
そしてservices.ymlに、あなたはサービスを登録しますその方法: 'サービス: AXO.listener.serializationlistener: クラス:AXO \ APIBundle \リスナー\シリアライズ\ SerializationListener タグ: - {名:jms_serializer.event_subscriber 、イベント:serializer.post_serialize、メソッド:onPostSerialize} ' – Vaseltior
なぜ、$ event-> getObject() - > getProviderName()のプロバイダがイメージプロバイダのハードコードではなく、 – ppetermann