Обновление формы с файлом в Symfony

117
27 августа 2021, 14:50

Доброго времени суток!

Я учусь работать с Symfony и построил простейшую форму для добавления в БД. Проблема в том, что при использовании такой же формы при редактировании записи валидатор ругается на то, что файл не может быть найден, пустое поле с файлом или нет. При редактировании записи загрузка файла по сути не должна быть обязательной, поэтому добавил новую опцию в FormType, но всё равно ошибка :(

ProjectsController:

   /**
     * @Route("/projects/{id}/edit", name="project_edit", methods={"GET", "POST"})
     */
    public function edit($id, Request $request) {
        $project = $this->getDoctrine()
            ->getRepository(Project::class)
            ->find($id);
        $em = $this->getDoctrine()->getManager();
        $form = $this->createForm(ProjectType::class, $project, ['require_photo' => false]);
        $form->handleRequest($request);
        if ($form->isSubmitted() && $form->isValid()) {
            $project = $form->getData();
            if ($request->files->get('photo')) {
                $filesystem = new Filesystem();
                $path = $this->getParameter('photos_directory') . '/' . $project->getPhoto();
                $filesystem->remove($path);
                $file = $form['photo']->getData();
                $fileName = uniqid() . '.' . $file->guessExtension();
                $file->move(
                    $this->getParameter('photos_directory'),
                    $fileName
                );
                $project->setPhoto($fileName);
            }
            $em->persist($project);
            $em->flush();
            $this->addFlash('success', 'Das Projekt wurde erfolgreich erschafft!');
            return $this->redirectToRoute('projects', [
            ]);
        }

ProjectEntity.php

/**
 * @ORM\Entity(repositoryClass="App\Repository\ProjectRepository")
 */
class Project
{
    ...
    /**
     * @ORM\Column(type="string", length=255, nullable=true)
     * @Assert\Image(maxSize="5000k")
     */
    private $photo;
    ...
    public function getPhoto(): ?string
    {
        return $this->photo;
    }
    public function setPhoto(?string $photo): self
    {
        $this->photo = $photo;
        return $this;
    }
}

ProjectType:

public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder->add('name', TextType::class, [
            'attr' => ['class' => 'form-control'],
        ]);
        $builder->add('description', TextareaType::class, [
            'attr' => ['class' => 'form-control'],
            'empty_data' => 'Beschreibung',
        ]);
        $builder->add('site', TextType::class, [
            'attr' => ['class' => 'form-control'],
            'empty_data' => 'Website'
        ]);
        $builder->add('photo', FileType::class, [
            'attr' => ['class' => 'custom-file-input'],
            'required' => $options['require_photo'],
            'mapped' => false,
        ]);
        $builder->add('save', SubmitType::class, [
            'label' => 'Projekt erstellen',
            'attr' => ['class' => 'btn btn-lg btn-success']
        ]);
    }
    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults([
            'data_class' => Project::class,
            'require_photo' => true,
        ]);
        $resolver->setAllowedTypes('require_photo', 'bool');
    }

edit.html.twig

<div class="custom-file">
        {{ form_widget(form.photo) }}
        {{ form_label(form.photo, 'Das Foto des Projektes', {
            'label_attr': {'class': 'custom-file-label'},
        }) }}
        {{ form_errors(form.photo) }}
    </div>
Answer 1

Проблема была в ProjectType, нужно было добавить contraints для билдера поля с файлом, и удалить валидацию файла в Entity и validator.yaml

$builder->add('photo', FileType::class, [
            'attr' => ['class' => 'custom-file-input'],
            'required' => $options['require_photo'],
            'mapped' => false,
            'constraints' => [
                new Image([
                    'maxSize' => '5000k'
                ])
            ]
        ]);
READ ALSO
Скачать картинку по url - PHP

Скачать картинку по url - PHP

Есть код который работает на других сайтах, а на этом работать не хочет

240
Получить числа и буквы

Получить числа и буквы

Есть текст (2ab(2ba)a), как получить 2ab и 2ba, если там могут быть другие числа и буквы?

178
Не отрабатывает скрипт php на странице HTML

Не отрабатывает скрипт php на странице HTML

Есть HTML-форма, которая отвечает за выбор валюты (для отображения цен в таблице)C формой работает скрипт PHP, который бы позволил сохранить последнюю...

116
Как правильно организовать парсер php?

Как правильно организовать парсер php?

Пишу парсер для одного сайтаНа сайте есть авторизация, это сильно усложняет, т

120