Symfony BootstrapCollection с VichUploader - удаление элемента не работает

Я использую BootstrapCollection из http://bootstrap.braincrafted.com/ с VichUploader https://github.com/dustin10/VichUploaderBundle

Работает нормально, кроме функции удаления. Если я пытаюсь удалить дочерний файл (PDF-файл), только свойство name будет пустым, но не вся строка / объект будет удален.

Родительский formType:

public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder->add(
            'files',
            BootstrapCollectionType::class,
            [
                'type'               => NewsPdfFileType::class,
                'required'           => false,
                'allow_add'          => true,
                'allow_delete'       => true,
                'label'              => 'PDF',
                'translation_domain' => 'entities',
            ]
        );
    }

Child FormType:

public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add(
                'pdfFile',
                VichFileType::class,
                [
                    'required'      => false,
                    'download_link' => true,
                    'allow_delete'  => true,
                    'label'         => 'PDF'
                ]
            );

    }

Это мои отношения:

Родительское лицо NewsPdf:

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

    /**
     * @ORM\OneToOne(targetEntity="Brightside\CMSBundle\Entity\News")
     */
    private $news;

    /**
     * @ORM\OneToMany(targetEntity="Mandant\CMSPlusBundle\Entity\NewsPdfFile", mappedBy="newsPdf", cascade={"persist"})
     */
    private $files;
.
.
.
.

Child Entity NewsPdfFile:

class NewsPdfFile
{
    /**
     * @var integer
     *
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;

    /**
     * @ORM\ManyToOne(targetEntity="Mandant\CMSPlusBundle\Entity\NewsPdf", inversedBy="files")
     * @JoinColumn(name="newsPdf_id", referencedColumnName="id")
     */
    private $newsPdf;

    /**
     * @var File
     *
     * @Vich\UploadableField(mapping="news_pdf", fileNameProperty="pdfName")
     *
     */
    private $pdfFile;

    /**
     * @ORM\Column(type="string", length=255, nullable=true)
     *
     * @var string
     */
    private $pdfName;

    /**
     * @ORM\Column(type="datetime")
     *
     * @var \DateTime
     */
    private $updatedAt;
.
.
.

В моей родительской сущности у меня уже есть функция удаления:

/**
     * @param NewsPdfFile $file
     */
    public function removeFile(NewsPdfFile $file)
    {
        $this->files->removeElement($file);
    }

но я не могу заставить его работать. Когда я пытаюсь удалить элемент (в моем formType есть опция allow_delete), только свойство "pdfName" будет пустым. Что я делаю неправильно?

1 ответ

Я нашел душу сам

Symfony не удаляет сущность из коллекции

Мне нужно изменить мою функцию удаления в родительской сущности:

    /**
     * @param NewsPdfFile $file
     */
    public function removeFile(NewsPdfFile $file)
    {
        $this->files->removeElement($file);
        $file->setPdfFile(null);
    }

и orphanRemoval=true в аннотации OneToMany:

    /**
     * @ORM\OneToMany(targetEntity="Mandant\CMSPlusBundle\Entity\NewsPdfFile", mappedBy="newsPdf", cascade={"persist"}, orphanRemoval=true)
     */
    private $files;
Другие вопросы по тегам