@ArtemioVegas
php developer

Symfony, Как корректно обновить сущность, имеющую поле типа «Файл»?

Всех приветствую! Изучаю Symfony
Проблема такая, имеется сущность Task, в которой есть свойства
<?php

namespace AppBundle\Entity;

use Doctrine\ORM\Mapping as ORM;

/**
 * Task
 *
 * @ORM\Table(name="task")
 * @ORM\Entity(repositoryClass="AppBundle\Repository\TaskRepository")
 */
class Task
{
     /**
     * @ORM\Column(type="string", nullable=true)
    */    
    private $originalFileName;
    /**
     * @ORM\Column(type="string", nullable=true)
    */    
    private $fileName;


В которых при сохранении пишется оригинальное имя файла, и хешированное имя файла на сервере.

Есть форма
<?php
namespace AppBundle\Form;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;
use Symfony\Component\Form\Extension\Core\Type\TextType;
use Symfony\Component\Form\Extension\Core\Type\FileType;

class TaskType extends AbstractType
{
    /**
     * {@inheritdoc}
     */
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
                ->add('taskName',TextType::class)
                ->add('fileName', FileType::class, array('label' => 'Документ'))                
                ;
    }/**
     * {@inheritdoc}
     */
    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults(array(
            'data_class' => 'AppBundle\Entity\Task'
        ));
    }


Есть экшн редактирование сущности.
Если при редактировании сущности у которой уже есть загруженный файл соответственно поля originalFileName и fileName заполнены, если файл инпут пустой, то старое значение originalFileName в БД становится null
Как сделать так, чтобы если значение из формы файл инпут пустое, то старое не перезатиралось?
Загрузку файла реализовывал c помощью
документации
  • Вопрос задан
  • 748 просмотров
Решения вопроса 1
voronkovich
@voronkovich
В представленном коде должно затираться свойство fileName, т.к. оно у вас указано в форме TaskType. Вообще говоря, в него должен сохраняться экземпляр UploadedFile (или null если поле не было заполнено при отправке формы), а у вас в аннотации указано, что это строковое поле.

Вам не нужно делать "мэппинг" поля с файлом в сущность (укажите 'mapped' => false):

public function buildForm(FormBuilderInterface $builder, array $options)
{
    $builder
        ->add('taskName',TextType::class)
        ->add('file', FileType::class, [ 'mapped' => false, 'label' => 'Документ'])                
    ;
}

Экземпляр UploadedFile можно получить вручную:

$uploadedFile = $form['file']->getData();

$fileName = 'myfile.txt';

$uploadedFile->move('public/uploads', $fileName);

$task->setFileName('public/uploads/'.$fileName);
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы