Я пытаюсь сохранить несколько файлов с помощью VichUploader Bundle. Имя файла хорошо сохраняется в базе данных, но, к сожалению, файл не перемещен в правильную папку.
Я использую Symfony 4 и VichUploaderBundle 1.8.3.
Вот мой класс альбома:
/**
* @ORM\Entity(repositoryClass = "App\Repository\AlbumRepository")
* @ORM\HasLifecycleCallbacks
*/
class Album
{
/**
* @ORM\Id()
* @ORM\GeneratedValue()
* @ORM\Column(type = "integer")
*/
private $id;
/**
* @ORM\OneToMany(targetEntity = "App\Entity\Photo", mappedBy = "album", orphanRemoval=true, cascade = {"persist", "remove"})
*/
private $photos;
/**
* @ORM\Column(type = "datetime")
*/
private $createdAt;
/**
* @ORM\Column(type = "text", nullable=true)
*/
private $description;
/**
* @ORM\Column(type = "string", length=255)
*/
private $title;
...
}
А теперь фото
/**
* @ORM\Entity(repositoryClass = "App\Repository\PhotoRepository")
* @Vich\Uploadable()
* @ORM\HasLifecycleCallbacks
*/
class Photo
{
/**
* @ORM\Id()
* @ORM\GeneratedValue()
* @ORM\Column(type = "integer")
*/
private $id;
/**
* @ORM\Column(type = "string", length=255)
*/
private $imageName;
/**
* @Vich\UploadableField(mapping = "album_images", fileNameProperty = "imageName")
* @var File
*/
private $imageFile;
/**
* @ORM\ManyToOne(targetEntity = "App\Entity\Album", inversedBy = "photos")
* @ORM\JoinColumn(nullable=false)
*/
private $album;
/**
* @ORM\Column(type = "datetime")
* @var \DateTime
*/
private $updatedAt;
...
}
Итак, чтобы использовать Bundle, я написал DataTransformer, который преобразует UploadedFile в Photo. Таким образом, я могу управлять массивом фотографий.
Этот PhotoTransformer довольно прост, я просто хочу переместить файлы из Front в Back-end.
class PhotoTransformer implements DataTransformerInterface
{
public function transform($value)
{
//We won't reverse the operation. It goes from front-end to back-end.
return [];
}
public function reverseTransform($value)
{
$photos = [];
foreach ($value as $file) {
$photo = new Photo();
$photo->setImageFile($file);
$photos[] = $photo;
}
return $photos;
}
}
А вот и мой AlbumType:
class AlbumType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
return $builder
->add('title', TextType::class)
->add('description', TextareaType::class)
->add($builder->create(
'photos', FileType::class, [
'required' => false,
'multiple' => true
]
)->addModelTransformer(new PhotoTransformer())
)
->add('button', SubmitType::class, [
'label' => 'Create'
]);
}
}
Как видите, я выполнил правило написанное здесь. Переменной, переданной в "setImageFile", является UploadedFile.
Однако, к сожалению, это не запускает загрузку на сервер.
Вы знаете, что мне не хватает?






Проблема была в vich_uploader.yaml, upload_destination был неправильным. Итак, я проверил в одном месте, а файлы были загружены в другом.
Теперь все работает нормально.
это могло не сработать, потому что вы не использовали метод перемещения файлов?
$photo->move($targetDirectory, $filename);
Спасибо за вашу помощь, потому что я не создал правильный файл конфигурации для VichUploader. Файл был хорошо загружен, но не в нужной папке назначения :)