Symfony 索纳塔管理图像场

Symfony 索纳塔管理图像场,symfony,sonata-admin,sonata-media-bundle,Symfony,Sonata Admin,Sonata Media Bundle,我正在使用Sonata Admin后端,我想在我的用户实体中添加一个新的图像字段,它是一个化身。因为我已经在使用SonataMediaBundle,所以我遵循了本教程: 以下是我的实体配置: /** * @var \Application\Sonata\MediaBundle\Entity\Media * * @ORM\ManyToOne(targetEntity="Application\Sonata\MediaBundle\Entity\Media", cascad

我正在使用Sonata Admin后端,我想在我的用户实体中添加一个新的图像字段,它是一个化身。因为我已经在使用
SonataMediaBundle
,所以我遵循了本教程:

以下是我的实体配置:

/**
 * @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;
不幸的是,我有很多问题:

  • 在我的后端中,不显示预览:
  • 如果我删除库中的媒体,我在编辑用户时会收到此错误:
    找不到id为(6)的“Application\Sonata\MediaBundle\Entity\media”类型的实体
  • 客户端无法使用生成的API(使用FOSRestBundle生成):

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

  • 在我的后端中,不显示预览:
  • 如前所述,我必须将自定义表单小部件添加到我的
    config.yml
    文件中:

    twig:
        # Sonata form themes
        form_themes:
            - 'SonataMediaBundle:Form:media_widgets.html.twig'
    
    在我的
    UserAdmin
    中:

    ->with('Profile')
        ->add('avatar', 'sonata_media_type', array(
            'provider' => 'sonata.media.provider.image',
            'context'  => 'default',
        ))
    ->end()
    
    现在将显示预览:)

  • 如果删除多媒体资料中的媒体,则在编辑类型为的用户:实体时会收到此错误 id(6)的“Application\Sonata\MediaBundle\Entity\Media”不可用 发现
  • 如前所述,我需要在我的实体上添加
    onDelete=“SET NULL”

    /**
     * @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;
    
  • 客户端无法使用生成的API(使用FOSRestBundle生成):
  • 这是一个非常棘手的问题,但我能够从post开始实现一个定制的JMS处理程序

    我查看了
    SonataMediaBundle
    源代码,发现了以下代码片段:

    /**
     * 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;
    }
    
    因此,我将其包含在源代码中,完整的处理程序如下所示:

    <?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;
        }
    }
    
    就这些

    <?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;
        }
    }
    
    app.serializer.media:
        class: AppBundle\Serializer\MediaHandler
        arguments:
          - '@sonata.media.pool'
        tags:
            - { name: jms_serializer.subscribing_handler }