首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >奏鸣曲管理图像场

奏鸣曲管理图像场
EN

Stack Overflow用户
提问于 2017-08-08 10:43:48
回答 1查看 1.2K关注 0票数 1

我正在使用奏鸣曲管理后端,我想添加一个新的图像字段到我的用户实体,这是一个化身。由于我已经在使用SonataMediaBundle,所以我遵循了本教程:https://sonata-project.org/blog/2013/10/11/mediabundle-mediatype-improved

以下是我的实体配置:

代码语言:javascript
复制
/**
 * @var \Application\Sonata\MediaBundle\Entity\Media
 *
 * @ORM\ManyToOne(targetEntity="Application\Sonata\MediaBundle\Entity\Media", cascade={"all"}, fetch="LAZY")
 * @ORM\JoinColumn(name="avatar_id", referencedColumnName="id")
 */
protected $avatar;

不幸的是,我有很多问题:

  1. 在我的后端,预览没有显示:

  1. 如果删除库中的媒体,则在编辑用户:Entity of type 'Application\Sonata\MediaBundle\Entity\Media' for IDs id(6) was not found时会收到此错误。
  2. 产生的API (用FOSRestBundle生成)无法被客户端使用:

“化身”:{ "provider_metadata":{“文件名”:"Test.png“},”名称“:"Test.png",”描述“:null,"enabled":false,"provider_name":"sonata.media.provider.image","provider_status":1,“"325564b03489a6473e7c9def01dc58bab611eccb.png",”:"provider_reference":1430,“高度”:321,“长度”:空,“版权”:空,"author_name":空,“上下文”:“默认”,"cdn_is_flushable":null,"cdn_flush_at":null,"cdn_status":null,"updated_at":“2017-08-08 T12:31:19+02:00”,"created_at":“2017-08-08 T12:31:19+02:00”,"content_type":"image/png","size":24978,"id":7}

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-08-08 13:49:55

我解决了这三个问题!我在这里为所有遇到同样困难的人提出了我的解决办法。

  1. 在我的后端,预览没有显示:

正如所解释的,这里必须向我的config.yml文件中添加一个自定义表单小部件:

代码语言:javascript
复制
twig:
    # Sonata form themes
    form_themes:
        - 'SonataMediaBundle:Form:media_widgets.html.twig'

在我的UserAdmin

代码语言:javascript
复制
->with('Profile')
    ->add('avatar', 'sonata_media_type', array(
        'provider' => 'sonata.media.provider.image',
        'context'  => 'default',
    ))
->end()

现在将显示预览:)

  1. 如果删除图库中的媒体,则在编辑id(6)的用户:类型为'Application\Sonata\MediaBundle\ Entity \ media‘的实体时会收到此错误。

正如解释过的这里,我需要在我的实体中添加onDelete="SET NULL"

代码语言:javascript
复制
/**
 * @var \Application\Sonata\MediaBundle\Entity\Media
 *
 * @ORM\ManyToOne(targetEntity="Application\Sonata\MediaBundle\Entity\Media", cascade={"persist"}, fetch="LAZY")
 * @ORM\JoinColumn(name="avatar_id", referencedColumnName="id", onDelete="SET NULL")
 */
protected $avatar;

  1. 产生的API (用FOSRestBundle生成)无法被客户端使用:

这是一个非常棘手的问题,但我能够实现一个从 post开始的定制JMS处理程序。

我窥视了一下SonataMediaBundle源代码,发现了以下代码片段:

代码语言:javascript
复制
/**
 * Returns media urls for each format.
 *
 * @ApiDoc(
 *  requirements={
 *      {"name"="id", "dataType"="integer", "requirement"="\d+", "description"="media id"}
 *  },
 *  statusCodes={
 *      200="Returned when successful",
 *      404="Returned when media is not found"
 *  }
 * )
 *
 * @param $id
 *
 * @return array
 */
public function getMediumFormatsAction($id)
{
    $media = $this->getMedium($id);

    $formats = array(MediaProviderInterface::FORMAT_REFERENCE);
    $formats = array_merge($formats, array_keys($this->mediaPool->getFormatNamesByContext($media->getContext())));

    $provider = $this->mediaPool->getProvider($media->getProviderName());

    $properties = array();
    foreach ($formats as $format) {
        $properties[$format]['url'] = $provider->generatePublicUrl($media, $format);
        $properties[$format]['properties'] = $provider->getHelperProperties($media, $format);
    }

    return $properties;
}

因此,我将它包含到我的源代码中,完整的处理程序如下:

代码语言:javascript
复制
<?php

namespace AppBundle\Serializer;

use Application\Sonata\MediaBundle\Entity\Media;
use JMS\Serializer\Context;
use JMS\Serializer\GraphNavigator;
use JMS\Serializer\Handler\SubscribingHandlerInterface;
use JMS\Serializer\JsonSerializationVisitor;
use Sonata\MediaBundle\Provider\MediaProviderInterface;

class MediaHandler implements SubscribingHandlerInterface
{
    private $mediaPool;

    public function __construct($mediaPool)
    {
        $this->mediaPool = $mediaPool;
    }

    public static function getSubscribingMethods()
    {
        return array(
            array(
                'direction' => GraphNavigator::DIRECTION_SERIALIZATION,
                'format'    => 'json',
                'type'      => 'Application\Sonata\MediaBundle\Entity\Media',
                'method'    => 'serializeToJson',
            ),
        );
    }

    public function serializeToJson(JsonSerializationVisitor $visitor, Media $media, array $type, Context $context)
    {
        $formats = array(MediaProviderInterface::FORMAT_REFERENCE);
        $formats = array_merge($formats, array_keys($this->mediaPool->getFormatNamesByContext($media->getContext())));

        $provider = $this->mediaPool->getProvider($media->getProviderName());

        $properties = array();
        foreach ($formats as $format) {
            $properties[$format]['url']        = $provider->generatePublicUrl($media, $format);
            $properties[$format]['properties'] = $provider->getHelperProperties($media, $format);
        }

        return $properties;
    }
}

服务设置:

代码语言:javascript
复制
app.serializer.media:
    class: AppBundle\Serializer\MediaHandler
    arguments:
      - '@sonata.media.pool'
    tags:
        - { name: jms_serializer.subscribing_handler }

仅此而已!

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45566188

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档