Ich versuche, ein JSON-Objekt ('Modul') mit einem ManyToOne Link zu einem Sonata \ MediaBundle \ Entity durch FOSRestBundle und JMS Serializer zurückzugeben. Wie soll ich das machen?FOSRestbundle, JMS Serializer und SonataMediaBundle geben öffentliche URL für Bild zurück
Hier ist ein Hack, den ich gemacht habe, aber denke nicht, dass es die beste Praxis ist.
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');
}
...
}
danke!
EDIT Dank Tatrimas Pajarskas und der Post, die er erwähnt. Hier ist die Klasse.
<?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'));
}
}
Und in services.yml würden Sie den Dienst registrieren, die Art und Weise: 'Dienstleistungen: AXO.listener.serializationlistener: Klasse: AXO \ APIBundle \ Listener \ Serialisierung \ SerializationListener tags: - {name: jms_serializer.event_subscriber , Ereignis: serializer.post_serialize, Methode: onPostSerialize} ' – Vaseltior
Warum nicht den Provider für $ event-> getObject() -> getProviderName() anstelle von hardcoded für den Image-Provider? – ppetermann