更新:我解决了我的问题><,可能当我完成重构时,我在我的方法getFile上留下了一个“:字符串”.
今天我尝试在我的项目中添加VichUploderBundle,但是我遇到了一些麻烦。我遵循了文档,但我不喜欢让一个属性可上传的方法(在同一个模型上添加3个属性就是为了这个目的,不好意思,但不太好),所以我开始创建一个只用于图像的实体,包含所有必要的属性,我还创建了一个新的FormType,并将其链接到我的父实体。但是现在,当我试图发布我的表单时,我得到了以下错误:
Return value of Vich\UploaderBundle\Mapping\PropertyMapping::getFile() must be an instance of Symfony\Component\HttpFoundation\File\File or null, string returned
(in vendor/vich/uploader-bundle/Mapping/PropertyMapping.php (line 80) )我试图添加一些转储来检查变量和她是否存在,但出于一个奇怪的原因,Vich将其检测为null。
图像实体
<?php
namespace App\Entity;
use App\Entity\Traits\CreatedAtTrait;
use App\Entity\Traits\CreatedByTrait;
use Doctrine\ORM\Mapping as ORM;
use Exception;
use Symfony\Component\HttpFoundation\File\File;
use Vich\UploaderBundle\Mapping\Annotation as Vich;
/**
* @ORM\Entity(repositoryClass="App\Repository\ImageRepository")
* @Vich\Uploadable
*/
class Image
{
use CreatedAtTrait;
use CreatedByTrait;
/**
* @ORM\Id()
* @ORM\GeneratedValue()
* @ORM\Column(type="integer")
*/
private $id;
/**
* @Vich\UploadableField(mapping="compose_logo", fileNameProperty="name", size="size")
* @var File
*/
private $file;
/**
* @ORM\Column(type="string", length=255)
*/
private $name;
/**
* @ORM\Column(type="integer")
*/
private $size;
public function getId(): ?int
{
return $this->id;
}
public function getFile(): ?string
{
return $this->file;
}
/**
* If manually uploading a file (i.e. not using Symfony Form) ensure an instance
* of 'UploadedFile' is injected into this setter to trigger the update. If this
* bundle's configuration parameter 'inject_on_load' is set to 'true' this setter
* must be able to accept an instance of 'File' as the bundle will inject one here
* during Doctrine hydration.
*
* @param File|null $file
* @return Image
* @throws Exception
*/
public function setFile(?File $file = null): self
{
$this->file = $file;
return $this;
}
public function getName(): ?string
{
return $this->name;
}
public function setName(string $name): self
{
$this->name = $name;
return $this;
}
public function getSize(): ?int
{
return $this->size;
}
public function setSize(int $size): self
{
$this->size = $size;
return $this;
}
}ImageType
<?php
namespace App\Form;
use App\Entity\Image;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;
use Vich\UploaderBundle\Form\Type\VichImageType;
class ImageType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('file', VichImageType::class, [
'required' => false,
])
;
}
public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults([
'data_class' => Image::class,
]);
}
}父实体
<?php
namespace App\Entity;
use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\Common\Collections\Collection;
use Doctrine\ORM\Mapping as ORM;
/**
* @ORM\Entity(repositoryClass="App\Repository\ParentRepository")
*/
class Parent
{
/**
* @ORM\Id()
* @ORM\GeneratedValue()
* @ORM\Column(type="integer")
*/
private $id;
/**
* @ORM\Column(type="string", length=255)
*/
private $name;
/**
* @ORM\OneToOne(targetEntity="App\Entity\Image", cascade={"persist", "remove"})
*/
private $logo;
public function __construct()
{
$this->variables = new ArrayCollection();
}
public function getId(): ?int
{
return $this->id;
}
public function getName(): ?string
{
return $this->name;
}
public function setName(string $name): self
{
$this->name = $name;
return $this;
}
public function getLogo(): ?Image
{
return $this->logo;
}
public function setLogo(?Image $logo): self
{
$this->logo = $logo;
return $this;
}
}ParentType
<?php
namespace App\Form;
use App\Entity\Parent;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\Extension\Core\Type\CollectionType;
use Symfony\Component\Form\Extension\Core\Type\TextareaType;
use Symfony\Component\Form\Extension\Core\Type\TextType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;
class ParentType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('logo', ImageType::class)
->add('name', TextType::class)
;
}
public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults([
'data_class' => Parent::class,
]);
}
}在测试中,我还尝试删除vendor/vich/uploader-bundle/Mapping/PropertyMapping.php中的注释以接受所有变量类型,并且当Doctrine试图将实体保存在数据库中时,中的所有属性除我的createdAt特征外都为空(但这可能是正常的,因为在此之前我有异常.)
另外,当我在vendor/vich/uploader-bundle/Mapping/PropertyMapping.php:https://imgur.com/NCEft1s中的第80行转储变量时,还有一个屏幕截图。
发布于 2019-06-09 16:50:18
您需要在您的类中将您的“徽标”属性定义为EntityType,而不是ImageType!所以更改这一行->add('logo', ImageType::class)
在symfony文档中有一个例子:https://symfony.com/doc/current/reference/forms/types/entity.html
https://stackoverflow.com/questions/56516469
复制相似问题