FOSRestbundle,JMS Serializer和SonataMediaBundle返回图像的公共URL

时间:2013-09-23 10:28:05

标签: jms symfony-sonata jmsserializerbundle

我正在尝试通过FOSRestBundle和JMS Serializer将带有ManyToOne链接的JSON对象('Module')返回到Sonata \ MediaBundle \ Entity。我应该怎么做呢?

这是我做过的黑客攻击,但不认为这是最好的做法。

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');
    }
    ...
}
谢谢你!

修改 感谢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 个答案:

答案 0 :(得分:2)

您可能希望看到Add extra fields using JMS Serializer bundle,因为它有一个示例,关于如何向依赖于外部类的序列化数据添加其他字段。