Php Symfony文件以编辑形式上载

Php Symfony文件以编辑形式上载,php,file-upload,symfony,symfony-forms,Php,File Upload,Symfony,Symfony Forms,我有以下用户实体 /** * @ORM\Entity */ class User { /** * @ORM\Column(type="integer") * @ORM\Id * @ORM\GeneratedValue(strategy="AUTO") */ private $id; /** * @ORM\Column(name="name", type="string", length=100, nullable=f

我有以下用户实体

/**
 * @ORM\Entity
 */
class User
{
    /**
     * @ORM\Column(type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;

    /**
     * @ORM\Column(name="name", type="string", length=100, nullable=false)
     */
    private $name;

    /**
     * @ORM\Column(type="string", name="picture", nullable=true)
     * @Assert\Image
     * @Assert\File(maxSize = "2M")
     */
    private $picture;

    /**
     * Get id
     *
     * @return integer
     */
    public function getId()
    {
        return $this->id;
    }

    /**
     * Set name
     *
     * @param string $name
     * @return User
     */
    public function setName($name)
    {
        $this->name = $name;
        return $this;
    }

    /**
     * Get name
     *
     * @return string
     */
    public function getName()
    {
        return $this->name;
    }

    public function setPicture($file)
    {
        $this->picture = $file;
        return $this;
    }

    public function getPicture()
    {
        return $this->picture;
    }
}
这是我的模板

class UserType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder->add('name', TextType::class, [
            'label' => 'Name *',
            'attr' => [
                'class' => 'form-control placeholder-height'
            ],
            'label_attr' => [
                'class' => 'col-md-2 professional-attr'
            ],
            'constraints' => [
                new Assert\NotBlank(),
                new Assert\Length(['min' => 3, 'max' => 50])
            ]
        ]);

        $builder->add('picture', FileType::class, [
            'label' => 'Profile Picture',
            'attr' => [
                'class' => 'form-control filestyle',
                'data-iconName' => 'glyphicon glyphicon-camera',
                'data-buttonText' => null,
                'accept' => 'image/*'
            ],
            'label_attr' => [
                'class' => 'col-md-2 professional-attr'
            ],
            'data_class' => null
        ]);

        $builder->add('confirm', SubmitType::class, [
            'label' => 'SUBMIT',
            'attr' => [
                'class' => 'submit'
            ]
        ]);
    }

    public function setDefaultOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults([
            'data_class' => 'UserBundle:User'
        ]);
    }
}
这是我控制器中的代码

public function professionalEditAction(Request $request)
{
    $em = $this->get('doctrine.orm.entity_manager');
    $user = $em->getRepository('UserBundle:User')->findOneBy(['id' => $request->get('id')]);
    if (!$user) {
        throw $this->createNotFoundException('Invalid user or user does not exist');
    }
    $form = $this->createForm(Form\ProfessionalType::class, $user, [
        'method' => 'POST',
        'attr' => [
            'class' => 'form-horizontal',
            'novalidate' => 'novalidate',
            'accept' => 'image/*'
        ]
    ]);
    $form->handleRequest($request);
    $response = [];
    $response['params'] = [];
    if($form->isSubmitted() && $request->isXmlHttpRequest() && !$form->isValid()) {
        $data = $form->getData();
        foreach ($form as $child) {
            if (!$child->isValid()) {
                $response['status'] = 'error';
                $response['next_action'] = 'fix_error';
                $response['params'] = [];
                foreach ($child->getErrors() as $error) {
                    $response['errors'][$child->getName()][] = $error->getMessage();
                }
            }
        }
        return new JsonResponse($response);
    }
    if ($form->isSubmitted() && $form->isValid()) {
        $data = $form->getData();
        $file = $user->getPicture();
        if ($file instanceof UploadedFile) {
            $fileName = md5(uniqid()).'.'.$file->guessExtension();
            $file->move(
                $this->getParameter('profile.picture.attachment.dir'),
                $fileName
            );
            $data->setPicture($fileName);
        }
        $em->persist($data);
        $em->flush();
        $request->getSession()->getFlashBag()->add('success', 'User created successfully!');
        return $this->redirect($this->generateUrl('admin_professional_create'));
    }
    return $this->render('UserBundle:Admin:professional.edit.html.twig', [
        'form' => $form->createView(),
        'user' => $user
    ]);
}
如果我上传了一个新的文件,它可以很好地工作,但是如果我提交的输入字段是空的,它会变为我不想要的
NULL
DB值,我想要的是,如果用户之前上传了图片,下次将其保留为空,就不要更改DB中图片的值

注意:我不确定这段信息是否有用,但我使用Ajax和FormData提交表单,为了保持简单,我省略了部分代码

我在这里遗漏了什么?

$em->persist($data)
正在被调用,无论文件是否已上载-尝试在其上方的if语句中移动它:

if ($file instanceof UploadedFile) {
     $fileName = md5(uniqid()).'.'.$file->guessExtension();
     $file->move(
        $this->getParameter('profile.picture.attachment.dir'),
        $fileName
    );
    $data->setPicture($fileName);
    $em->persist($data); // Place here
}
因此,只有上传了文件,才会持久化对象

或者,如果该表单上有其他字段可以更改,并且无论何时该表单都需要持久化,您是否可以在if语句之前将数据设置为当前用户图片值

$file = $user->getPicture();
$data->setPicture($file); // Store the current value from the DB before overwriting below
if ($file instanceof UploadedFile) {
     $fileName = md5(uniqid()).'.'.$file->guessExtension();
     $file->move(
        $this->getParameter('profile.picture.attachment.dir'),
        $fileName
    );
    $data->setPicture($fileName);
}
$em->persist($data); // Leave here in original place