Probleme d'enregistrement de fichier image

Default
,

Bonjour,

Sur Symfony3, je tente de permettre l'enregistrement d'images dans un formulaire.

Ce que je fais

Je génère bien le formulaire, mais il ne se valide pas :

   --------------------Mes méthodes :

    public function createAction(Request $request)
    {
        $activity = new Activities();
        $form = $this->createCreateForm($activity);
        $form->handleRequest($request);

        if ($form->isValid()) {
            $em = $this->getDoctrine()->getManager();
            $em->persist($activity);
            $em->flush();

            return $this->redirect($this->generateUrl('adminActivities_show', array('id' => $activity->getId())));
        }

        return $this->render('xxxBundle:Administration:Activities/layout/new.html.twig', array(
            'activity' => $activity,
            'form'   => $form->createView(),
        ));
    }

   private function createCreateForm(Activities $activity)
    {
        $form = $this->createForm(ActivitiesType::class, $activity);

        $form->add('submit', SubmitType::class, array('label' => 'Ajouter'));

        return $form;
    }


    ------Dans le From :

    namespace xxx\xxxBundle\Form;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;
use Symfony\Component\Form\Extension\Core\Type\FileType;

class MediaType extends AbstractType
{
    /**
     * @param FormBuilderInterface $builder
     * @param array $options
     */
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('file', FileType::class,
                    array('data_class' => null),
                    array('required' => false))
            ->add('name');
    }

    ----------Et mes entités :

    <?php

namespace xxx\xxxBundle\Entity;

use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Validator\Constraints as Assert;

/**
 * Media
 *
 * @ORM\Table("media")
 * @ORM\Entity(repositoryClass="xxx\xxxBundle\Repository\MediaRepository")
 * @ORM\HasLifecycleCallbacks
 */
class Media
{
    /**
     * @var integer
     *
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;

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

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

    private $file;

    public function getUploadRootDir()
    {
        return __dir__.'/../../../../web/uploads';
    }

    public function getAbsolutePath()
    {
        return null === $this->path ? null : $this->getUploadRootDir().'/'.$this->path;
    }

    public function getAssetPath()
    {
        return 'uploads/'.$this->path;
    }

    /**
     * @ORM\PrePersist()
     * @ORM\PreUpdate()
     */
    public function preUpload()
    {
        $this->tempFile = $this->getAbsolutePath();
        $this->oldFile = $this->getPath();
        $this->updateAt = new \DateTime();

        if (null !== $this->file)
            $this->path = sha1(uniqid(mt_rand(),true)).'.'.$this->file->guessExtension();
    }

    /**
     * @ORM\PostPersist()
     * @ORM\PostUpdate()
     */
    public function upload()
    {
        if (null !== $this->file) {
            $this->file->move($this->getUploadRootDir(),$this->path);
            unset($this->file);

            if ($this->oldFile != null) unlink($this->tempFile);
        }
    }

    /**
     * @ORM\PreRemove()
     */
    public function preRemoveUpload()
    {
        $this->tempFile = $this->getAbsolutePath();
    }

    /**
     * @ORM\PostRemove()
     */
    public function removeUpload()
    {
        if (file_exists($this->tempFile)) unlink($this->tempFile);
    }
    /**
     * Get id
     *
     * @return integer
     */
    public function getId()
    {
        return $this->id;
    }

    public function getPath()
    {
        return $this->path;
    }

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

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

Ce que je veux

Je voudrais que l'image aille s'écrire dans le fichier /web/uploads

Ce que j'obtiens

Une belle erreur "Could not determine access type for property "file" in class"
... erreur que je peux "contourner" en ajoutant " 'mapped' => false) " à mon formulaire : il enregistre dans ce cas bien mon activité, mais évidement pas l'image, ce qui prouve bien que l'erreur viens du chargement de l'image.

Je précise que je débute sur Symfony... soyez indulgent.

Merci beaucoup à tous ceux qui me liront.

Sylvain

2 Réponse

17162
,

Bonjour.
As-tu pensé à visionner Tutoriel Vidéo Symfony » Annotation et Upload de fichiers ?

Default
,

Merci pour le lien Lartak, mais j’ai arrêté le tuto car je ne parviens pas à récupérer les annotations des classes de garfikart dans la vue de mon app ! (un « dump » ne renvoie que les variables de l’ORM, et pas celle des annotations)… c'est assez désespérant !
Un peu compliqué pour moi ce tuto d’ailleurs (je rappelle que je débute). J’ai donc décidé d’utiliser le bundle VichUploaderBundle.