我正在使用奏鸣曲管理后端,我想添加一个新的图像字段到我的用户实体,这是一个化身。由于我已经在使用SonataMediaBundle,所以我遵循了本教程:https://sonata-project.org/blog/2013/10/11/mediabundle-mediatype-improved
以下是我的实体配置:
/**
* @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;不幸的是,我有很多问题:

Entity of type 'Application\Sonata\MediaBundle\Entity\Media' for IDs id(6) was not found时会收到此错误。“化身”:{ "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}
发布于 2017-08-08 13:49:55
我解决了这三个问题!我在这里为所有遇到同样困难的人提出了我的解决办法。
正如所解释的,这里必须向我的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()现在将显示预览:)
正如解释过的这里,我需要在我的实体中添加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;这是一个非常棘手的问题,但我能够实现一个从这 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;
}
}服务设置:
app.serializer.media:
class: AppBundle\Serializer\MediaHandler
arguments:
- '@sonata.media.pool'
tags:
- { name: jms_serializer.subscribing_handler }仅此而已!
https://stackoverflow.com/questions/45566188
复制相似问题