FOSRestbundle、JMS Serializer 和 SonataMediaBundle 返回图像的公共 url

Posted

技术标签:

【中文标题】FOSRestbundle、JMS Serializer 和 SonataMediaBundle 返回图像的公共 url【英文标题】:FOSRestbundle, JMS Serializer and SonataMediaBundle return public url for image 【发布时间】:2013-09-28 05:10:21 【问题描述】:

我正在尝试通过 FOSRestBundle 和 JMS Serializer 返回一个带有指向 Sonata\MediaBundle\Entity 的多对一链接的 JSON 对象(“模块”)。我该怎么做呢?

这是我做的一个 hack,但不认为这是最好的做法。

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'));
    

【问题讨论】:

在 services.yml 中,您可以通过这种方式注册服务:services: AXO.listener.serializationlistener: class: AXO\APIBundle\Listener\Serialization\SerializationListener tags: - name: jms_serializer.event_subscriber, event: serializer.post_serialize, method: onPostSerialize 为什么不为 $event->getObject()->getProviderName() 获取提供者,而不是为图像提供者硬编码? 【参考方案1】:

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

【讨论】:

以上是关于FOSRestbundle、JMS Serializer 和 SonataMediaBundle 返回图像的公共 url的主要内容,如果未能解决你的问题,请参考以下文章

无法使用 FOSRestBundle

无法使用 Symfony 5 安装 FOSRestBundle

FOSRestBundle 不加载路由

FOSRestBundle:控制器必须返回给定的响应(Array())

如何扩展 FOSRestBundle RequestBodyParamConverter?

Symfony + FOSRestBundle - 如何允许 NULL 值到配置有自定义表单类型的字段?