Как передавать сохраненные данные в поле в Symfony?

80
11 апреля 2021, 17:50

У меня есть сущность POST с полем cover, которое содержит сущность - картинку

//src/Entity/Post.php
/**
     * @var Image
     * @ORM\ManyToOne(targetEntity="Image", cascade={"persist"})
     * @ORM\JoinColumn(name="cover_id", referencedColumnName="id")
     **/
    private $cover;

И когда я редактирую POST с помощью простой функции:

//src/Controller/PostController.php
  /**
     * @Route("/{id}/edit", name="post_edit", methods={"GET","POST"})
     */
    public function edit(Request $request, Post $post): Response
    {
        $form = $this->createForm(PostType::class, $post);
        $form->handleRequest($request);
        if ($form->isSubmitted() && $form->isValid()) {
            $this->getDoctrine()->getManager()->flush();
            return $this->redirectToRoute('post_index');
        }
        return $this->render('post/edit.html.twig', [
            'post' => $post,
            'form' => $form->createView(),
        ]);
    }

И формы:

//src/Form/PostType.php
class PostType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('cover', ImageType::class, array(
                'label' => 'Cover'
            ));
    }
    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults([
            'data_class' => Post::class
        ]);
    }
}
//src/Form/ImagetType.php
class ImageType extends FileType
{
    private $imagePath;
    /**
     * ImageType constructor.
     * @param $imagePath
     */
    public function __construct($imagePath)
    {
        $this->imagePath = $imagePath;
    }
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        parent::buildForm($builder, $options);
        $builder->addModelTransformer(new CallbackTransformer(
            function(Image $image = null) {
                if ($image instanceof Image) {
                    return new File($this->imagePath . '/' . $image->getFile());
                }
            },
            function(UploadedFile $uploadedFile = null) {
                if ($uploadedFile instanceof UploadedFile) {
                    $image = new Image();
                    $image->setFile($uploadedFile);
                    return $image;
                }
            }
        ));
    }
    public function getBlockPrefix()
    {
        return 'image';
    }
    public function configureOptions(OptionsResolver $resolver)
    {
        parent::configureOptions($resolver);
        $resolver->setDefaults([
            'required' => false
        ]);
    }
}

То при отправки формы поле cover (даже если оно заполнено у объекта) приходит пустым. Как сделать так, чтобы при редактировании других полей сущности Post, если в cover что-то есть, чтобы это сохранялось?

P.S. Загрузка файла позаимствована отсюда - https://github.com/cirykpopeye/easy-image-uploading-with-symfony-4/tree/master/app

Answer 1

Единственное вменяемое что здесь можно посоветовать, то это использовать VichUploaderBundle .

Либо почитать документацию и внимательно посмотреть как в официальной документации предлагают обрабатывать файлы.

READ ALSO
POST не передает данные

POST не передает данные

Есть форма регистрации и скрипт, который отправляет post'om данные на пхп скрипт, и тот должен записать все в БД после регистрации пользователяНо...

115
Как обойти блокировку инстаграм?

Как обойти блокировку инстаграм?

У меня есть php скрипт для подписки на пользователей, после каждой подписки я отправляю скрипт в сон на 61 секунду, так как нашел, что запросы...

123
Поиск и замена элементов в массиве

Поиск и замена элементов в массиве

есть исходный массив $people:

94
Как получить папку письма IMAP?

Как получить папку письма IMAP?

Собственно интересуют входящие сообщения, которые не попали ни в одну папку и лежат в корневой INBOXСмотрел заголовки и тело письма, там нет...

95