VichUploaderBundle & OneToOne Relation - PullRequest
       85

VichUploaderBundle & OneToOne Relation

0 голосов
/ 09 июня 2019

[Обновление]: я решил свою проблему> <, возможно, когда я произвел рефакторинг, я оставил «:? String» в моем методе getFile ... </p>

Сегодня я попытался добавить VichUploderBundle в свой проект, но я столкнулся с некоторыми проблемами. Я следовал за документацией, но мне не нравится способ сделать одно свойство загружаемым (для этого добавьте 3 свойства в одну и ту же модель, извините, но это не очень красиво) Поэтому я начал создавать Entity только для Image со всеми необходимыми свойствами, я также создал новый FormType и связал все с моим Parent Entity. Но теперь, когда я пытаюсь опубликовать свою форму, я получаю эту ошибку:

Return value of Vich\UploaderBundle\Mapping\PropertyMapping::getFile() must be an instance of Symfony\Component\HttpFoundation\File\File or null, string returned
(in vendor/vich/uploader-bundle/Mapping/PropertyMapping.php (line 80) )

Я попытался добавить дамп, чтобы проверить переменную, и она существует, но по странной причине Вич обнаруживает, что это значение равно нулю.

Изображение Entity

<?php

namespace App\Entity;

use App\Entity\Traits\CreatedAtTrait;
use App\Entity\Traits\CreatedByTrait;
use Doctrine\ORM\Mapping as ORM;
use Exception;
use Symfony\Component\HttpFoundation\File\File;
use Vich\UploaderBundle\Mapping\Annotation as Vich;

/**
 * @ORM\Entity(repositoryClass="App\Repository\ImageRepository")
 * @Vich\Uploadable
 */
class Image
{
    use CreatedAtTrait;
    use CreatedByTrait;

    /**
     * @ORM\Id()
     * @ORM\GeneratedValue()
     * @ORM\Column(type="integer")
     */
    private $id;

    /**
     * @Vich\UploadableField(mapping="compose_logo", fileNameProperty="name", size="size")
     * @var File
     */
    private $file;

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

    /**
     * @ORM\Column(type="integer")
     */
    private $size;

    public function getId(): ?int
    {
        return $this->id;
    }

    public function getFile(): ?string
    {
        return $this->file;
    }

    /**
     * If manually uploading a file (i.e. not using Symfony Form) ensure an instance
     * of 'UploadedFile' is injected into this setter to trigger the update. If this
     * bundle's configuration parameter 'inject_on_load' is set to 'true' this setter
     * must be able to accept an instance of 'File' as the bundle will inject one here
     * during Doctrine hydration.
     *
     * @param File|null $file
     * @return Image
     * @throws Exception
     */
    public function setFile(?File $file = null): self
    {
        $this->file = $file;

        return $this;
    }

    public function getName(): ?string
    {
        return $this->name;
    }

    public function setName(string $name): self
    {
        $this->name = $name;

        return $this;
    }

    public function getSize(): ?int
    {
        return $this->size;
    }

    public function setSize(int $size): self
    {
        $this->size = $size;

        return $this;
    }
}

ImageType

<?php

namespace App\Form;

use App\Entity\Image;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;
use Vich\UploaderBundle\Form\Type\VichImageType;

class ImageType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('file', VichImageType::class, [
                'required' => false,
            ])
        ;
    }

    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults([
            'data_class' => Image::class,
        ]);
    }
}

Родительский субъект

<?php

namespace App\Entity;

use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\Common\Collections\Collection;
use Doctrine\ORM\Mapping as ORM;

/**
 * @ORM\Entity(repositoryClass="App\Repository\ParentRepository")
 */
class Parent
{
    /**
     * @ORM\Id()
     * @ORM\GeneratedValue()
     * @ORM\Column(type="integer")
     */
    private $id;

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

    /**
     * @ORM\OneToOne(targetEntity="App\Entity\Image", cascade={"persist", "remove"})
     */
    private $logo;

    public function __construct()
    {
        $this->variables = new ArrayCollection();
    }

    public function getId(): ?int
    {
        return $this->id;
    }

    public function getName(): ?string
    {
        return $this->name;
    }

    public function setName(string $name): self
    {
        $this->name = $name;

        return $this;
    }


    public function getLogo(): ?Image
    {
        return $this->logo;
    }

    public function setLogo(?Image $logo): self
    {
        $this->logo = $logo;

        return $this;
    }
}

ParentType

<?php

namespace App\Form;

use App\Entity\Parent;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\Extension\Core\Type\CollectionType;
use Symfony\Component\Form\Extension\Core\Type\TextareaType;
use Symfony\Component\Form\Extension\Core\Type\TextType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;

class ParentType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('logo', ImageType::class)
            ->add('name', TextType::class)
        ;
    }

    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults([
            'data_class' => Parent::class,
        ]);
    }
}

И для теста я также попытался удалить аннотации в vendor / vich / uploader-bundle / Mapping / PropertyMapping.php, чтобы принять все типы переменных и когда Doctrine пытается сохранить объект в базе данных, все свойства в моем объекте Image имеют значение null, кроме моей черты созданного атрибута (но это, вероятно, нормально, так как у меня есть исключения до этого ...)

Также есть снимок экрана, когда я выгружаю переменную в строке 80 в vendor / vich / uploader-bundle / Mapping / PropertyMapping.php: https://imgur.com/NCEft1s

1 Ответ

0 голосов
/ 09 июня 2019

Вам необходимо определить свойство 'logo' как EntityType в вашем классе ParentType, а не ImageType! Так что поменяйте эту строку ->add('logo', ImageType::class)

У вас есть пример в документации Symfony: https://symfony.com/doc/current/reference/forms/types/entity.html

...